<!DOCTYPE HTML>
<html lang="zh-CN">


<head>
    <meta charset="utf-8">
    <meta name="keywords" content="IPv4部分协议信息汇总, 十二惊惶的gitee">
    <meta name="description" content="地址解析协议 ARP[TOC]
ARP的定义与基本功能
掌握ARP协议的报文格式

掌握ARP协议的工作原理

理解ARP高速缓存的作用

掌握ARP缓存表的维护过程


ARP(Address Resolution Protocol，RF">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no">
    <meta name="renderer" content="webkit|ie-stand|ie-comp">
    <meta name="mobile-web-app-capable" content="yes">
    <meta name="format-detection" content="telephone=no">
    <meta name="apple-mobile-web-app-capable" content="yes">
    <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
    <meta name="referrer" content="no-referrer-when-downgrade">
    <!-- Global site tag (gtag.js) - Google Analytics -->


    <title>IPv4部分协议信息汇总 | 十二惊惶的gitee</title>
    <link rel="icon" type="image/png" href="/shier_jinghuang/favicon.png">
    


    <!-- bg-cover style     -->



<link rel="stylesheet" type="text/css" href="/shier_jinghuang/libs/awesome/css/all.min.css">
<link rel="stylesheet" type="text/css" href="/shier_jinghuang/libs/materialize/materialize.min.css">
<link rel="stylesheet" type="text/css" href="/shier_jinghuang/libs/aos/aos.css">
<link rel="stylesheet" type="text/css" href="/shier_jinghuang/libs/animate/animate.min.css">
<link rel="stylesheet" type="text/css" href="/shier_jinghuang/libs/lightGallery/css/lightgallery.min.css">
<link rel="stylesheet" type="text/css" href="/shier_jinghuang/css/matery.css">
<link rel="stylesheet" type="text/css" href="/shier_jinghuang/css/my.css">
<link rel="stylesheet" type="text/css" href="/shier_jinghuang/css/dark.css" media="none" onload="if(media!='all')media='all'">




    <link rel="stylesheet" href="/shier_jinghuang/libs/tocbot/tocbot.css">
    <link rel="stylesheet" href="/shier_jinghuang/css/post.css">




    



    <script src="/shier_jinghuang/libs/jquery/jquery-3.6.0.min.js"></script>

<meta name="generator" content="Hexo 5.4.0"><link rel="alternate" href="/shier_jinghuang/atom.xml" title="十二惊惶的gitee" type="application/atom+xml">
</head>


<body>
    <header class="navbar-fixed">
    <nav id="headNav" class="bg-color nav-transparent">
        <div id="navContainer" class="nav-wrapper container">
            <div class="brand-logo">
                <a href="/shier_jinghuang/" class="waves-effect waves-light">
                    
                    <img src="/shier_jinghuang/medias/1.jpg" class="logo-img" alt="LOGO">
                    
                    <span class="logo-span">十二惊惶的gitee</span>
                </a>
            </div>
            

<a href="#" data-target="mobile-nav" class="sidenav-trigger button-collapse"><i class="fas fa-bars"></i></a>
<ul class="right nav-menu">
  
  <li class="hide-on-med-and-down nav-item">
    
    <a href="/shier_jinghuang/" class="waves-effect waves-light">
      
      <i class="fas fa-home" style="zoom: 0.6;"></i>
      
      <span>首页</span>
    </a>
    
  </li>
  
  <li class="hide-on-med-and-down nav-item">
    
    <a href="/shier_jinghuang/tags" class="waves-effect waves-light">
      
      <i class="fas fa-tags" style="zoom: 0.6;"></i>
      
      <span>标签</span>
    </a>
    
  </li>
  
  <li class="hide-on-med-and-down nav-item">
    
    <a href="/shier_jinghuang/categories" class="waves-effect waves-light">
      
      <i class="fas fa-bookmark" style="zoom: 0.6;"></i>
      
      <span>分类</span>
    </a>
    
  </li>
  
  <li class="hide-on-med-and-down nav-item">
    
    <a href="/shier_jinghuang/archives" class="waves-effect waves-light">
      
      <i class="fas fa-archive" style="zoom: 0.6;"></i>
      
      <span>归档</span>
    </a>
    
  </li>
  
  <li class="hide-on-med-and-down nav-item">
    
    <a href="/shier_jinghuang/about" class="waves-effect waves-light">
      
      <i class="fas fa-user-circle" style="zoom: 0.6;"></i>
      
      <span>关于</span>
    </a>
    
  </li>
  
  <li class="hide-on-med-and-down nav-item">
    
    <a href="/shier_jinghuang/contact" class="waves-effect waves-light">
      
      <i class="fas fa-comments" style="zoom: 0.6;"></i>
      
      <span>留言板</span>
    </a>
    
  </li>
  
  <li class="hide-on-med-and-down nav-item">
    
    <a href="/shier_jinghuang/friends" class="waves-effect waves-light">
      
      <i class="fas fa-address-book" style="zoom: 0.6;"></i>
      
      <span>友情链接</span>
    </a>
    
  </li>
  
  <li>
    <a href="#searchModal" class="modal-trigger waves-effect waves-light">
      <i id="searchIcon" class="fas fa-search" title="搜索" style="zoom: 0.85;"></i>
    </a>
  </li>
  <li>
    <a href="javascript:;" class="waves-effect waves-light" onclick="switchNightMode()" title="深色/浅色模式" >
      <i id="sum-moon-icon" class="fas fa-sun" style="zoom: 0.85;"></i>
    </a>
  </li>
</ul>


<div id="mobile-nav" class="side-nav sidenav">

    <div class="mobile-head bg-color">
        
        <img src="/shier_jinghuang/medias/1.jpg" class="logo-img circle responsive-img">
        
        <div class="logo-name">十二惊惶的gitee</div>
        <div class="logo-desc">
            
            犁牛之子骍且角，虽欲勿用，山川其舍诸
            
        </div>
    </div>

    <ul class="menu-list mobile-menu-list">
        
        <li class="m-nav-item">
	  
		<a href="/shier_jinghuang/" class="waves-effect waves-light">
			
			    <i class="fa-fw fas fa-home"></i>
			
			首页
		</a>
          
        </li>
        
        <li class="m-nav-item">
	  
		<a href="/shier_jinghuang/tags" class="waves-effect waves-light">
			
			    <i class="fa-fw fas fa-tags"></i>
			
			标签
		</a>
          
        </li>
        
        <li class="m-nav-item">
	  
		<a href="/shier_jinghuang/categories" class="waves-effect waves-light">
			
			    <i class="fa-fw fas fa-bookmark"></i>
			
			分类
		</a>
          
        </li>
        
        <li class="m-nav-item">
	  
		<a href="/shier_jinghuang/archives" class="waves-effect waves-light">
			
			    <i class="fa-fw fas fa-archive"></i>
			
			归档
		</a>
          
        </li>
        
        <li class="m-nav-item">
	  
		<a href="/shier_jinghuang/about" class="waves-effect waves-light">
			
			    <i class="fa-fw fas fa-user-circle"></i>
			
			关于
		</a>
          
        </li>
        
        <li class="m-nav-item">
	  
		<a href="/shier_jinghuang/contact" class="waves-effect waves-light">
			
			    <i class="fa-fw fas fa-comments"></i>
			
			留言板
		</a>
          
        </li>
        
        <li class="m-nav-item">
	  
		<a href="/shier_jinghuang/friends" class="waves-effect waves-light">
			
			    <i class="fa-fw fas fa-address-book"></i>
			
			友情链接
		</a>
          
        </li>
        
        
        <li><div class="divider"></div></li>
        <li>
            <a href="https://gitee.com/Im-so-scared-2/shier_jinghuang" class="waves-effect waves-light" target="_blank">
                <i class="fab fa-github-square fa-fw"></i>十二惊惶
            </a>
        </li>
        
    </ul>
</div>


        </div>

        
            <style>
    .nav-transparent .github-corner {
        display: none !important;
    }

    .github-corner {
        position: absolute;
        z-index: 10;
        top: 0;
        right: 0;
        border: 0;
        transform: scale(1.1);
    }

    .github-corner svg {
        color: #0f9d58;
        fill: #fff;
        height: 64px;
        width: 64px;
    }

    .github-corner:hover .octo-arm {
        animation: a 0.56s ease-in-out;
    }

    .github-corner .octo-arm {
        animation: none;
    }

    @keyframes a {
        0%,
        to {
            transform: rotate(0);
        }
        20%,
        60% {
            transform: rotate(-25deg);
        }
        40%,
        80% {
            transform: rotate(10deg);
        }
    }
</style>

<a href="https://gitee.com/Im-so-scared-2/shier_jinghuang" class="github-corner tooltipped hide-on-med-and-down" target="_blank"
   data-tooltip="十二惊惶" data-position="left" data-delay="50">
    <svg viewBox="0 0 250 250" aria-hidden="true">
        <path d="M0,0 L115,115 L130,115 L142,142 L250,250 L250,0 Z"></path>
        <path d="M128.3,109.0 C113.8,99.7 119.0,89.6 119.0,89.6 C122.0,82.7 120.5,78.6 120.5,78.6 C119.2,72.0 123.4,76.3 123.4,76.3 C127.3,80.9 125.5,87.3 125.5,87.3 C122.9,97.6 130.6,101.9 134.4,103.2"
              fill="currentColor" style="transform-origin: 130px 106px;" class="octo-arm"></path>
        <path d="M115.0,115.0 C114.9,115.1 118.7,116.5 119.8,115.4 L133.7,101.6 C136.9,99.2 139.9,98.4 142.2,98.6 C133.8,88.0 127.5,74.4 143.8,58.0 C148.5,53.4 154.0,51.2 159.7,51.0 C160.3,49.4 163.2,43.6 171.4,40.1 C171.4,40.1 176.1,42.5 178.8,56.2 C183.1,58.6 187.2,61.8 190.9,65.4 C194.5,69.0 197.7,73.2 200.1,77.6 C213.8,80.2 216.3,84.9 216.3,84.9 C212.7,93.1 206.9,96.0 205.4,96.6 C205.1,102.4 203.0,107.8 198.3,112.5 C181.9,128.9 168.3,122.5 157.7,114.1 C157.9,116.9 156.7,120.9 152.7,124.9 L141.0,136.5 C139.8,137.7 141.6,141.9 141.8,141.8 Z"
              fill="currentColor" class="octo-body"></path>
    </svg>
</a>
        
    </nav>

</header>

    



<div class="bg-cover pd-header post-cover" style="background-image: url('/shier_jinghuang/medias/featureimages/12.jpg')">
    <div class="container" style="right: 0px;left: 0px;">
        <div class="row">
            <div class="col s12 m12 l12">
                <div class="brand">
                    <h1 class="description center-align post-title">IPv4部分协议信息汇总</h1>
                </div>
            </div>
        </div>
    </div>
</div>




<main class="post-container content">

    
    <div class="row">
    <div id="main-content" class="col s12 m12 l9">
        <!-- 文章内容详情 -->
<div id="artDetail">
    <div class="card">
        <div class="card-content article-info">
            <div class="row tag-cate">
                <div class="col s7">
                    
                    <div class="article-tag">
                        
                            <a href="/shier_jinghuang/tags/%E7%BD%91%E7%BB%9C%E5%8D%8F%E8%AE%AE%E5%88%86%E6%9E%90/">
                                <span class="chip bg-color">网络协议分析</span>
                            </a>
                        
                    </div>
                    
                </div>
                <div class="col s5 right-align">
                    
                    <div class="post-cate">
                        <i class="fas fa-bookmark fa-fw icon-category"></i>
                        
                            <a href="/shier_jinghuang/categories/%E7%BD%91%E7%BB%9C%E5%B7%A5%E7%A8%8B%E7%9B%B8%E5%85%B3/" class="post-category">
                                网络工程相关
                            </a>
                        
                    </div>
                    
                </div>
            </div>

            <div class="post-info">
                
                <div class="post-date info-break-policy">
                    <i class="far fa-calendar-minus fa-fw"></i>发布日期:&nbsp;&nbsp;
                    2022-12-15
                </div>
                

                
                <div class="post-date info-break-policy">
                    <i class="far fa-calendar-check fa-fw"></i>更新日期:&nbsp;&nbsp;
                    2022-12-16
                </div>
                

                
                <div class="info-break-policy">
                    <i class="far fa-file-word fa-fw"></i>文章字数:&nbsp;&nbsp;
                    18.8k
                </div>
                

                
                <div class="info-break-policy">
                    <i class="far fa-clock fa-fw"></i>阅读时长:&nbsp;&nbsp;
                    65 分
                </div>
                

                
                    <div id="busuanzi_container_page_pv" class="info-break-policy">
                        <i class="far fa-eye fa-fw"></i>阅读次数:&nbsp;&nbsp;
                        <span id="busuanzi_value_page_pv"></span>
                    </div>
				
            </div>
        </div>
        <hr class="clearfix">

        
        <!-- 是否加载使用自带的 prismjs. -->
        <link rel="stylesheet" href="/shier_jinghuang/libs/prism/prism.min.css">
        

        

        <div class="card-content article-card-content">
            <div id="articleContent">
                <h2 id="地址解析协议-ARP"><a href="#地址解析协议-ARP" class="headerlink" title="地址解析协议 ARP"></a>地址解析协议 ARP</h2><p>[TOC]</p>
<h3 id="ARP的定义与基本功能"><a href="#ARP的定义与基本功能" class="headerlink" title="ARP的定义与基本功能"></a>ARP的定义与基本功能</h3><ul>
<li><p>掌握ARP协议的报文格式</p>
</li>
<li><p>掌握ARP协议的工作原理</p>
</li>
<li><p>理解ARP高速缓存的作用</p>
</li>
<li><p>掌握ARP缓存表的维护过程</p>
</li>
</ul>
<p><strong>ARP</strong>(Address Resolution Protocol，RFC 826）是根据IP地址获取物理地址的一个TCP/IP协议。主机通过将ARP请求<strong>广播</strong>到网络上的所有主机并接收返回消息来确定目标IP地址的物理地址，同时将IP地址和硬件地址存入本机ARP缓存中，下次请求时直接查询<strong>ARP缓存</strong>。</p>
<h4 id="物理地址："><a href="#物理地址：" class="headerlink" title="物理地址："></a>物理地址：</h4><p>物理地址通常是由硬件来实现的，例如以太网的物理地址被写入到网卡中，任何一块网卡的物理地址是唯一的</p>
<blockquote>
<p style="color:blue;">物理地址的长度和格式取决于具体的网络，以太网的物理地址是6字节地址物理地址可以是单播地址、多播地址或广播地址。</p>
</blockquote>
<h4 id="逻辑地址："><a href="#逻辑地址：" class="headerlink" title="逻辑地址："></a>逻辑地址：</h4><p>逻辑地址与物理设备本身没有关联, 逻辑地址可以是单播地址、多播地址和广播地址。</p>
<blockquote>
<p style="color:skyblue;">目前Internet上的IPv4协议逻辑地址是32位的IP地址， IPv6地址有128位长
</blockquote>
<h4 id="地址解析"><a href="#地址解析" class="headerlink" title="地址解析:"></a>地址解析:</h4><p>逻辑地址是在网络层使用的，但数据包是在物理网络传递。主机或路由器是通过物理地址来识别的,因此将一个数据包传递到一个主机或路由器要进行寻址，需要将一个逻辑地址映射到相应的物理地址。</p>
<blockquote>
<p style="color:blue;">地址解析就是主机在发送帧前将目的逻辑地址转换成目的物理地址的过程。</p>
</blockquote>
<h5 id="静态映射"><a href="#静态映射" class="headerlink" title="静态映射:"></a>静态映射:</h5><p>手工创建IP地址与物理地址的映射关系，建立映射表。当已知IP地址时，通过查找映射表得到对应的物理地址。</p>
<blockquote>
<p style="color:orange;">局限性: 主机更换了网卡，也就改变了主机的物理地址。当主机从一个网络移到另一个网络时，物理地址没变，但IP地址改变了。·要适应这些变化，会增大维护静态映射表的开销。</p>
</blockquote>
<h5 id="用协议实现地址映射："><a href="#用协议实现地址映射：" class="headerlink" title="用协议实现地址映射："></a>用协议实现地址映射：</h5><p>在使用TCP/IP协议的以太网中，<strong>ARP</strong>(Address Resolution Protocol)协议完成将IP地址映射到MAC地址的过程，逆地址解析协议<strong>RARP</strong>(Reverse Address Resolution Protocol)将物理地址映射为IP地址</p>
<h3 id="ARP的报文格式："><a href="#ARP的报文格式：" class="headerlink" title="ARP的报文格式："></a>ARP的报文格式：</h3><img src="https://im-so-scared-2.gitee.io/shier_jinghuang/2022/11/12/网际协议IP/ARP的报文格式.png"  />

<p style="color:blue; text-indent: 112px;">硬件类型:16bit，定义运行ARP的网络类型，如以太网的硬件类型是1。</p>
<p style="color:blue; text-indent: 112px;">协议类型:16bit，定义使用ARP的高层协议，如对于IPv4协议，该字段的值是Ox0800。</p>
<p style="color:blue; text-indent: 112px;">硬件长度:8bit，以字节为单位的物理地址长度，如以太网硬件地址长度为6。</p>
<p style="color:blue; text-indent: 112px;">协议长度:8bit，以字节为单位的逻辑地址的长度，对于IPv4，该字段为4。<p>
<p style="color:blue; text-indent: 112px;">操作码:16bit,1表示ARP请求，2表示ARP应答。</p>
<p style="color:blue; text-indent: 112px;">发送端硬件地址:变长字段，对于以太网该字段长度是6字节</p>
<p style="color:blue; text-indent: 112px;">发送端逻辑地址:变长字段，对于IPv4地址，该字段长度为4字节。</p>
<p style="color:rgb(255, 118, 0); text-indent: 112px;">目的端硬件地址:变长字段，对于ARP请求报文，该字段全为0</p>
<p style="color:blue; text-indent: 112px;">目的端逻辑地址:变长字段，定义目标逻辑地址。</p>
<p style="color:black;">ARP数据报直接封装在数据链路层的帧中</p>
<center><img src="https://im-so-scared-2.gitee.io/shier_jinghuang/2022/11/12/网际协议IP/ARP封装.png" style="zoom:80%;" /></center>


<h3 id="ARP的运行过程："><a href="#ARP的运行过程：" class="headerlink" title="ARP的运行过程："></a>ARP的运行过程：</h3><h4 id="数据包传输步骤"><a href="#数据包传输步骤" class="headerlink" title="数据包传输步骤"></a>数据包传输步骤</h4><blockquote>
<ul>
<li>发送端知道目的端的IP地址。</li>
<li>IP要求ARP创建一个ARP请求报文，其中包含了发送方的物理地址、发送方的IP地址和目的端的IP地址。目的端的物理地址用0填充</li>
<li>将报文传递到数据链路层，并在该层中用<strong>发送方的物理地址作为源地址</strong>，<strong>用物理广播地址作为目的地址</strong>，将其封装在一个帧中。</li>
<li>因为该帧中包含了一个<strong>广播</strong>目的地址，所以同一链路中的每个主机或路由器都接收到这个帧。所有接收到该帧的主机都将其传递到ARP层进行处理。<strong>除了目的端主机以外的所有主机都丢弃该报文</strong>。</li>
<li>目的主机用一个包含其物理地址的ARP应答报文<strong>单播</strong>做响应。</li>
<li>发送方接收到这个应答报文，这样它就知道了目标主机的物理地址。</li>
<li>将IP数据报封装在一个帧中，并单播到目的地址。</li>
</ul>
</blockquote>
<h3 id="ARP高速缓存："><a href="#ARP高速缓存：" class="headerlink" title="ARP高速缓存："></a>ARP高速缓存：</h3><p>当主机A通过ARP请求得到B的物理地址后就将“IP地址—MAC地址”的绑定信息存储在<strong>高速缓存</strong>中。对于后续发往E的分组，可以通过缓存得到物理地址<br>当ARP被询问一个已知IP地址节点的MAC地址时，先在ARP缓存表查看，若存在，就直接返回MAC地址，若不存在，才发送ARP请求向局域网查询。</p>
<h4 id="缓存表内容："><a href="#缓存表内容：" class="headerlink" title="缓存表内容："></a>缓存表内容：</h4><p>静态项目一直保留在缓存中，直到重新启动计算机为止。</p>
<p>动态项目随时间推移自动添加和删除，每个动态ARP缓存项的潜在生命周期是10分钟。<br>新加到缓存中的项目带有时间戳，如果某个项目添加后2分钟内没有再使用，则此项目过期并从ARP缓存中删除;<br>如果某个项目已在使用，则又收到2分钟的生命周期;<br>如果某个项目始终在使用，则会另外收到2分钟的生命周期，一直到10分钟的最长生命周期。</p>
<h4 id="arp命令的用法"><a href="#arp命令的用法" class="headerlink" title="arp命令的用法:"></a>arp命令的用法:</h4><p>arp命令用于对本地arp缓存进行操作，不会发送ARP请求</p>
<blockquote>
<ul>
<li>arp -a:              列出ARP缓存中的所有条目</li>
<li>arp -a ip:          列出缓存中与ip对应的条目</li>
<li>arp -d:              清空arp缓存</li>
<li>arp -d ip:          删除缓存中与ip对应的条目</li>
<li>arp -s ip mac : 在arp缓存中添加一个静态arp条目</li>
</ul>
</blockquote>
<h2 id="网际协议IP"><a href="#网际协议IP" class="headerlink" title="网际协议IP"></a>网际协议IP</h2><h3 id="IP协议简介（lP-Internet-Protocol）"><a href="#IP协议简介（lP-Internet-Protocol）" class="headerlink" title="IP协议简介（lP- Internet Protocol）"></a>IP协议简介（lP- Internet Protocol）</h3><ul>
<li>网际协议IP是TCP/IP最核心的协议，也是最重要的因特网标准协议之一</li>
<li>IP负责将数据包从源点交付到终点，所有的TCP、UDP、ICMP及IGMP数据都以IP数据报格式传输。</li>
</ul>
<h4 id="IP的特性："><a href="#IP的特性：" class="headerlink" title="IP的特性："></a>IP的特性：</h4><blockquote>
<p style="color:blue;">不可靠:不保证分组成功地送到目的站。任何可靠性的要求必须由上层协议实现。</p>
</blockquote>
<blockquote>
<p style="color:orange;">无连接:IP并不维护任何后续分组的状态信息，每个分组都是相互独立的</p>
</blockquote>
<blockquote>
<p style="color:red;">尽最大努力交付:IP协议尽力发送每个分组，只有当资源用完或网络出现故障时才会发送失败</p>
</blockquote>
<h4 id="IP地址及表示方法："><a href="#IP地址及表示方法：" class="headerlink" title="IP地址及表示方法："></a>IP地址及表示方法：</h4><p>IP地址：一个IP地址惟一地标识了Internet上的一台主机，IPv4协议使用32位地址，这表示地址空间是2^32。而IPv6协议使用128位地址，地址空间为2^128。<br>表示方法：点分十进制表示:每个字节用一个十进制数表示。</p>
<img src="https://im-so-scared-2.gitee.io/shier_jinghuang/2022/11/12/网际协议IP/IP地址分类.png"/>

<h5 id="网络号："><a href="#网络号：" class="headerlink" title="网络号："></a>网络号：</h5><p>D类地址和E类地址不划分网络号和主机号。</p>
<img src="https://im-so-scared-2.gitee.io/shier_jinghuang/2022/11/12/网际协议IP/网络号.png" style="zoom:67%;" />

<h5 id="特殊的IP地址："><a href="#特殊的IP地址：" class="headerlink" title="特殊的IP地址："></a>特殊的IP地址：</h5><blockquote>
<p style="color:blue;">网络地址:主机号全0的IP地址，不分配给任何主机，作为网络本身的标识</p>
</blockquote>
<blockquote>
<p style="color:orange;">广播地址:主机号为全1的IP地址，用作广播地址，目的地址为广播地址的数据包传递给该网络中的所有节点</p>
</blockquote>
<blockquote>
<p style="color:skyblue;">有限广播地址:32位为全“1”的IP地址(255.255.255.255)，通常由无盘工作站启动时使用，希望从网络IP地址服务器处获得一个IP地址
</p>
</blockquote>
<blockquote>
<p style="color:red;">主机本身地址:32位全“0”的IP地址(0.0.0.0)称为主机本身地址</p>
- 当一个主机要获得其IP地址时，可以运行一个引导程序，并发送一个以全0为源地址、以全1为目的地址的分组给引导服务器，以获得本主机的IP地址。
</blockquote>
<blockquote>
<p style="color:black;">环回地址:27.0.0.1称为回环地址，可用来测试TCP/IP协议是否正常工作，常用于本机上软件测试和本机上网络应用程序之间的通信地址。</p>
- 使用回送地址发送数据，协议软件立即返回，不进行任何网络传输。
</blockquote>
<h5 id="专用IP地址："><a href="#专用IP地址：" class="headerlink" title="专用IP地址："></a>专用IP地址：</h5><p>专用lIP地址:仅用于专用网内部的本地主机。<br>大多数路由器不转发携带专用IP地址的数据包，本地主机必须经网络地址转换服务器才能访问Internet。<br>专用IP地址范围: </p>
<img src="https://im-so-scared-2.gitee.io/shier_jinghuang/2022/11/12/网际协议IP/专用IP地址.png" style="zoom:67%;" />

<h4 id="子网划分："><a href="#子网划分：" class="headerlink" title="子网划分："></a>子网划分：</h4><p><strong>Subnetting</strong><br>提高IP空间的利用率，增加IP分配的灵活性。<br>从主机号借用若干个比特作为子网号subnet-id，而主机号host-id也就相应减少若干个比特</p>
<p><img src="https://im-so-scared-2.gitee.io/shier_jinghuang/2022/11/12/%E7%BD%91%E9%99%85%E5%8D%8F%E8%AE%AEIP/%E5%AD%90%E7%BD%91%E5%88%92%E5%88%86%E7%A4%BA%E6%84%8F%E5%9B%BE.png"></p>
<h4 id="子网掩码："><a href="#子网掩码：" class="headerlink" title="子网掩码："></a>子网掩码：</h4><blockquote>
<p style="color:blue;">子网掩码是一个网络号全1，主机号全0的32位二进制数，用于确定P中有多少位用于子网号。</p>
- **~~表示方法~~**：点分十进制，IP地址后用`/`后面写明网络号的位数
- 子网掩码与IP地址**按位做与**得到IP地址对应的**网络地址**
</blockquote>
<h3 id="IP数据格式："><a href="#IP数据格式：" class="headerlink" title="IP数据格式："></a>IP数据格式：</h3><p><img src="https://im-so-scared-2.gitee.io/shier_jinghuang/2022/11/12/%E7%BD%91%E9%99%85%E5%8D%8F%E8%AE%AEIP/IP%E7%9A%84%E6%8A%A5%E6%96%87%E6%A0%BC%E5%BC%8F.png"></p>
<p>IP数据报由首部和数据两部分组成</p>
<h4 id="各字段的含义："><a href="#各字段的含义：" class="headerlink" title="各字段的含义："></a>各字段的含义：</h4><p>版本:4 bit，指IP协议的版本，目前的IP协议版本号为4(即IPv4)</p>
<p>首部长度:4 bit，以4字节为单位，因此IP的首部长度最大是60字节</p>
<p>服务类型: 8 bit，区分服务，一般不用。</p>
<p>总长度: 16 bit，首部和数据之和的长度，单位为字节，因此数据报的最大长度为65535字节。总长度不能超过网络的最大传输单元MTU。</p>
<p>标识:16 bit，数据报计数器</p>
<blockquote>
<p>IP软件在存储器中维持一个计数器，每产生一个数据报，计数器加1，并将此值赋给标识字段。<br>当数据报由于长度超过网络MTU而必须分片时，标识字段的值就被复制到所有的数据报分片的标识字段中。<br>相同的标识字段的值使分片后的各数据报片能正确重组成原来的数据报。</p>
</blockquote>
<p>标志: 3 bit，目前只有两位有意义</p>
<blockquote>
<ul>
<li>第一位保留。</li>
<li>中间一位记为DF，为不分片标志，只有当DF=0时才允许分片。</li>
<li>最后一位为MF，MF=1表示后面还有分片，MF=O表示这是最后一个数据报片。</li>
</ul>
</blockquote>
<p>偏移量:13 bit，较长的分组被分片后，某分片在原分组中的相对位置。片偏移以8个字节为单位。每个分片的长度必须是8的整数倍。</p>
<p>生存时间:8 bit，记为TTL (Time To Live)</p>
<blockquote>
<ul>
<li><p>表明数据报在网络中的寿命，其单位为秒。现在TTL的单位是跳数，指明数据报在因特网中至多可经过多少个路由器，最大值为255，通常为32、64、128。</p>
</li>
<li><p>当TTL值为1时，表示这个数据报只能在本局域网内传送，因为这个数据报传送到局域网上的某个路由器，在被转发之前TTL值就减小到0，因而会被路由器丢弃。</p>
</li>
</ul>
</blockquote>
<p>协议: 8 bit，指出此数据报携带的数据使用何种协议，以便目的主机的IP层将数据部分上交给对应的进程处理。</p>
<p><img src="https://im-so-scared-2.gitee.io/shier_jinghuang/2022/11/12/%E7%BD%91%E9%99%85%E5%8D%8F%E8%AE%AEIP/IP%E7%9A%84%E9%AB%98%E5%B1%82%E5%8D%8F%E8%AE%AE.png"></p>
<p>首部检验和:16 bit，检验数据报的首部，不包括数据部分。采用简单的16位反码求和的计算方法。</p>
<p>源IP地址: 32bit，定义了源主机的IP地址。在IP数据包从源主机传送到目的主机期间，该字段保持不变。</p>
<p>目的IP地址: 32bit，定义了目的主机的IP地址。在IP数据报从源主机传送到目的主机期间，该字段保持不变。</p>
<h3 id="IP数据报分片："><a href="#IP数据报分片：" class="headerlink" title="IP数据报分片："></a>IP数据报分片：</h3><p>数据包可能经过多个不同的网络，每一个路由器把收到的帧进行拆装，处理后又封装成另一个帧。<br>收到帧的格式与长度取决于这个帧刚经过的物理网络所使用的协发<br>送出去的帧的格式与长度取决于这个帧将要经过的物理网络所使用的协议。</p>
<p><strong>最大传输单元MTU</strong>：不同网络所能传送的数据包的最大长度是不同的，这个最大长度叫做最大传输单元MTU ( Maximum Transmission Unit ) </p>
<blockquote>
<p style="color:orange;">MTU即该网络的数据链路层帧的数据部分的最大长度。</p>
</blockquote>
<h4 id="分片："><a href="#分片：" class="headerlink" title="分片："></a>分片：</h4><blockquote>
<ul>
<li><p>对于物理网络，如果数据包的长度超过了MTU，就要把数据部分进行分片。</p>
</li>
<li><p>每个分片都有自己的首部。</p>
</li>
<li><p>如果已经分片的数据包要经过更小MTU的网络，那么这些已经分片的数据包还可再进行分片，数据包在到达最后终点之前可以经过多次的分片。</p>
</li>
<li><p style="color:red;">数据包可以被源主机或在其路径上的路由器进行分片，但是数据包的重装只能在目的主机上进行。</p></li>
</ul>
</blockquote>
<h4 id="重组"><a href="#重组" class="headerlink" title="重组"></a>重组</h4><h5 id="目的主机进行分片重组"><a href="#目的主机进行分片重组" class="headerlink" title="目的主机进行分片重组"></a>目的主机进行分片重组</h5><blockquote>
<p style="color:blue;">IP规定，数据报分片的重组地点是目的主机，中间路由器不对任何被分片的数据报进行重组，即使其转发接口的MTU非常大。</p>
</blockquote>
<blockquote>
<p>优点:<br>简化了路由软件的操作，提高了路由器的处理效率。<br>可以避免重复分片。在数据报投递过程中，途经网络的MTU是不可预知的</p>
</blockquote>
<blockquote>
<p>缺点<br>浪费带宽。因为每个分片都要有一个首部，分片越多，首部开销越大。<br>增加了数据包丢失的可能性。分片越多，丢失的可能性越大。一旦丢失了一个分片，整个数据报就必须重新传输。</p>
</blockquote>
<h5 id="分片重组："><a href="#分片重组：" class="headerlink" title="分片重组："></a>分片重组：</h5><p>有关的三个字段是:标识字段、标志字段和偏移量字段。</p>
<p>当目的主机收到一个数据报时，可以根据偏移量和MF位判断:</p>
<ul>
<li>片偏移不为0，表明它是一个分片;</li>
<li>如果片偏移为0，且MF位为1，表明它是第一个分片;</li>
<li>如果片偏移为0，且MF位为0，则表明它是一个完整的数据报。</li>
</ul>
<p>根据数据报首部“标识”字段的值，可判断哪些分片属于同一个原始数据报片偏移用来确定分片在原始数据报中的位置。</p>
<h5 id="重组定时器："><a href="#重组定时器：" class="headerlink" title="重组定时器："></a>重组定时器：</h5><p>为防止因等待一个丢失的分片而无限期延长重组过程，在重组分片时启动一个定时器,如果超时后仍然没有收到一个数据报的全部分片，则该数据报被丢弃。<br>IP数据报校验和：</p>
<blockquote>
<p style="color:blue;">校验和：数据包上的附加信息，能够识别数据包在传输过程中是否出错。</p>
</blockquote>
<p>发送端先计算校验和，并把得到的结果与数据包一起发送出去。接收端对数据包进行同样的计算。若结果正确，则接受这个数据包，否则就丢弃它。</p>
<h4 id="校验和的计算："><a href="#校验和的计算：" class="headerlink" title="校验和的计算："></a>校验和的计算：</h4><p>发送端：将数据包按16位分段。把这些段用反码算术运算相加，将相加后得到的和再取反码就得出了校验和。<br>接收端：把收到的数据包按16位分段，并把这些段相加。得到的和取反码。若结果为0，则接受这个数据包，否则拒绝这个数据包。</p>
<img src="https://im-so-scared-2.gitee.io/shier_jinghuang/2022/11/12/网际协议IP/校验计算.png" style="zoom: 50%;" />

<h4 id="说明："><a href="#说明：" class="headerlink" title="说明："></a>说明：</h4><blockquote>
<blockquote>
<p style="color:blue;">IP数据包的校验和只校验IP首部部分而不校验IP数据部分。</p>
</blockquote>
<ul>
<li>首先，所有将数据封装在IP数据报中的高层协议，都有覆盖整个数据包的校验和。因此，IP数据报的校验和就不必再检验所封装的数据部分。</li>
<li>其次，每经过一个路由器，IP数据包的首部就要改变一次，但数据部分不改变。因此若校验和包含数据部分，这就意味着路由器要花费很多时间计算没有改变的数据部分的校验和。</li>
</ul>
</blockquote>
<h2 id="Internet组管理协议IGMP"><a href="#Internet组管理协议IGMP" class="headerlink" title="Internet组管理协议IGMP"></a>Internet组管理协议IGMP</h2><pre class="line-numbers language-python" data-language="python"><code class="language-python"><span class="token comment"># 掌握IGMP协议的报文格式</span>
<span class="token comment"># 掌握IGMP协议的工作原理</span>
<span class="token comment"># 理解多播组地址到以太网地址的映射</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span></span></code></pre>

<h3 id="单播与多播与广播"><a href="#单播与多播与广播" class="headerlink" title="单播与多播与广播:"></a>单播与多播与广播:</h3><blockquote>
<p style="color:red;">单播(unicast):    单个源站与单个目的站之间的通信叫作单播，IP数据报中的源IP地址和目的IP地址分别代表了源站和目的站。</p>
</blockquote>
<blockquote>
<p style="color:blue;">绝大多数的网络应用程序是单播</p>
</blockquote>
<blockquote>
<p style="color:red;">多播/组播(multicast): 一个源站和多个目的站之间的通信叫作多播。</p>
</blockquote>
<blockquote>
<ul>
<li>IP数据报中的源地址是单播地址，目的地址是组地址(D类地址)</li>
<li>路由器收到组播数据包后，可从它的多个接口转发出去<br>目前，组播机制没有被广泛支持，主要的组播路由机制有距离向量多播路由协议(DVMRP)和协议无关组播(PIM) .</li>
</ul>
</blockquote>
<blockquote>
<p style="color:red;">广播(broadcast):广播源站和目的站是一对多的，源站只有一个，但所有其它主机都是目的站Internet不支持广播，因为这会产生非常大的通信量</p>
</blockquote>
<h4 id="组播"><a href="#组播" class="headerlink" title="组播:"></a>组播:</h4><p>优点：采用组播技术后，即使用户数量成倍增长，主干网带宽不需要随之增加。从而解决了宽带应用对带宽和服务质量的要求问题</p>
<img src="https://im-so-scared-2.gitee.io/shier_jinghuang/2022/11/12/网际协议IP/组播示意.png" style="zoom: 33%;" />

<p>组播比多个单播具有更小的分组时延</p>
<h5 id="组播地址范围："><a href="#组播地址范围：" class="headerlink" title="组播地址范围："></a>组播地址范围：</h5><blockquote>
<ol>
<li>IANA(国际因特网地址分配委员会）把D类地址空间用于IP组播地址</li>
<li>IP组播地址的范围是:224.0.0.0~239.255.255.255</li>
<li>常用的组播地址<ul>
<li>224.0.0.1        在本子网上的所有参加多播的主机和路由器</li>
<li>224.0.0.2        在本子网上的所有参加多播的路由器</li>
<li>224.0.0.5        用来给一个网段中所有的OSPF路由器发送OSPF路由信息</li>
<li>224.0.0.9        RIPv2组地址</li>
<li>224.0.0.11      供DHCP服务器和中继代理使用</li>
</ul>
</li>
</ol>
</blockquote>
<h5 id="动态的组成员"><a href="#动态的组成员" class="headerlink" title="动态的组成员"></a>动态的组成员</h5><blockquote>
<p style="color:orange;">多播组中的成员是动态的。一个进程可请求其主机参加某个特定组，或在任意时间退出该组</p>
</blockquote>
<h5 id="使用硬件进行多播"><a href="#使用硬件进行多播" class="headerlink" title="使用硬件进行多播"></a>使用硬件进行多播</h5><blockquote>
<p style="color:orange;">当数据报传送到以太网时，以太网利用硬件进行多播，交付给属于该组成员的主机</p>
</blockquote>
<h4 id="多播组地址到以太网地址的转换"><a href="#多播组地址到以太网地址的转换" class="headerlink" title="多播组地址到以太网地址的转换"></a>多播组地址到以太网地址的转换</h4><p>多播以太网地址的前25位是0000000100000000010111100这意味着与IP多播相对应的以太网地址范围从01005E000000到01005E7FFFFF。然后将多播IP地址的低23位映射到以太网地址中的低23位。</p>
<img src="https://im-so-scared-2.gitee.io/shier_jinghuang/2022/11/12/网际协议IP/多播地址到以太网地址的转换.png" style="zoom: 50%;" />

<p>由于D类地址的组标识字段长为28bit，将低23位复制到多播MAC地址中，有5bit未使用，所以<strong>映射是多对一的</strong>。</p>
<p><strong>32个多播IP地址映射到一个以太网多播地址</strong>。既然地址映射不是惟一的，那么设备驱动程序或lP层就必须对数据报进行过滤。因为网卡可能接收到主机不想接收的多播数据帧。另外，如果网卡不提供足够的多播数据帧过滤功能,设备驱动程序就必须接收所有多播数据帧，然后对它们进行过滤。</p>
<h3 id="IGMP协议简介："><a href="#IGMP协议简介：" class="headerlink" title="IGMP协议简介："></a>IGMP协议简介：</h3><p>IGMP ( lnternet Group Management Protocol)协议，IGMP位于网络层。</p>
<p style="color:orange;">IGMP协议运行于主机和主机直接相连的路由器之间，是IP主机用来报告多播组成员身份的协议</p>
利用IGMP协议，一方面可以使主机通知本地路由器希望加入并接收某个特定多播组的信息;另一方面，路由器可以周期性地查询局域网内某个已知组的成员是否处于活动状态。
IGMP使用预留的组播地址224.0.0.1与本地路由器通信。

<h3 id="IGMP报文格式："><a href="#IGMP报文格式：" class="headerlink" title="IGMP报文格式："></a>IGMP报文格式：</h3><p>IGMP协议目前有三个版本IGMP、IGMPv2和IGMPv3。</p>
<p>其中IGMPv2有3种报文类型:</p>
<blockquote>
<p>查询报文:路由器查询多播组中是否有活跃成员，分为一般查询和特定查询</p>
<p>成员关系报告报文:加入多播组或响应查询报文。</p>
<p>退出报告报文:离开多播组。</p>
</blockquote>
<h4 id="IGMPv2报文格式："><a href="#IGMPv2报文格式：" class="headerlink" title="IGMPv2报文格式："></a>IGMPv2报文格式：</h4><img src="https://im-so-scared-2.gitee.io/shier_jinghuang/2022/11/12/网际协议IP/IGMPv2报文格式.png" style="zoom:67%;" />

<ol>
<li><p>类型:定义了IGMP报文类型</p>
<img src="https://im-so-scared-2.gitee.io/shier_jinghuang/2022/11/12/网际协议IP/IGMP报文类型.png" style="zoom: 80%;" /></li>
<li><p>响应时间:规定查询必须在多长时间内回答，以十分之一秒为单位。默认值为10秒。在查询报文中，这个值不为0，在其它报文中此字段值为0</p>
</li>
<li><p>检验和:对整个IGMP报文进行检验，算法同IP数据报</p>
</li>
<li><p>组地址:在一般查询报文中值为0。在特殊的查询报文、成员关系报告报文以及退出报文中值为相应的多播组地址</p>
</li>
</ol>
<h4 id="IGMP的封装"><a href="#IGMP的封装" class="headerlink" title="IGMP的封装"></a>IGMP的封装</h4><p>IGMP报文被封装在IP数据报中，IP层有3个字段需要注意:</p>
<blockquote>
<ul>
<li>协议类型:值为2，高层协议类型为2的IP数据包，其数据部分要交给IGMP协议处理。</li>
<li>生存时间:值为1，保证了这个报文不离开这个局域网。因为IGMP的作用范围是局域网，IGMP报文不能够发送到局域网以外的地方。</li>
<li>目的IP地址:为D类组播地址。</li>
</ul>
</blockquote>
<h3 id="多播组成员的加入和退出："><a href="#多播组成员的加入和退出：" class="headerlink" title="多播组成员的加入和退出："></a>多播组成员的加入和退出：</h3><h4 id="加入一个组"><a href="#加入一个组" class="headerlink" title="加入一个组"></a>加入一个组</h4><p>每个主机维护一张成员关系表，成员关系表是**&lt;进程名，组名&gt;<strong>表项的集合。当一个进程P要加入一个新组MG时，就向主机发出申请，主机就在成员关系表中增加</strong>&lt;P, MG&gt;**表项。</p>
<blockquote>
<ul>
<li>如果MG在表中不存在，主机就发送成员关系报告报文</li>
<li>如果MG在表中已经存在，那就不必发送成员关系报告报文，因为主机已经是MG这个组的成员了</li>
</ul>
</blockquote>
<img src="https://im-so-scared-2.gitee.io/shier_jinghuang/2022/11/12/网际协议IP/加入多播组.png" style="zoom:67%;" />

<p>路由器也维护一个多播地址表，给出了连接到每一个接口的成员关系。如果对于这些接口中的一个组有兴趣时，路由器就发送成员关系报告报文，以记录连接在它的接口上的所有的多播组。<br>IGMP协议要求把成员关系报告报文在很短的时间内发送两次。这样，如果第一个报文丢失或受到损伤，那么第二个报文可以代替它。</p>
<h4 id="退出一个组"><a href="#退出一个组" class="headerlink" title="退出一个组"></a>退出一个组</h4><ol>
<li><p>当主机发现在一个群组MG中已经没有进程时，就发送退出报告报文，多播路由器收到该报告。当路由器发现在一个特定组中已经没有连接在它的接口上感兴趣的网络，它就发送退出这个组的报告。</p>
</li>
<li><p>多播路由器收到退出报告报文时，并不立即删除这个群组MG，而是发送针对MG的查询报文，因为这个退出群组报告仅仅是从一个站点发送来的，可能还有其他站点仍然需要这个群组。</p>
</li>
<li><p>若在指定时间内没有收到站点对该群组的成员关系报告，就意味着在本网络上没有这个群组MG的成员，删除这个群组。</p>
<img src="https://im-so-scared-2.gitee.io/shier_jinghuang/2022/11/12/网际协议IP/退出多播组.png" style="zoom:67%;" /></li>
</ol>
<h4 id="监视组成员关系"><a href="#监视组成员关系" class="headerlink" title="监视组成员关系"></a>监视组成员关系</h4><blockquote>
<ul>
<li>当仅有一台主机留在一个组中时，如果这台主机离开了这个组而没有发送退出报告报文，那么多播路由器将永远收不到退出报告报文，它认为这个组一直存在这个成员。</li>
</ul>
</blockquote>
<p>多播路由器负责监视局域网上的所有主机或路由器,多播路由器周期性地发送<strong>一般查询报文</strong>，在这个报文中，组地址被置为<strong>0.0.0.0</strong>。</p>
<p>路由器期望着在它的组表中的每一个组的回答，甚至新的组也可以回答。查询报文的最大响应时间是10秒。当主机路由器收到一般查询报文时，如果它对一个组感兴趣，就发送成员关系报告报文。</p>
<h4 id="延迟响应"><a href="#延迟响应" class="headerlink" title="延迟响应"></a>延迟响应</h4><blockquote>
<p style="color:blue;">IGMP使用延迟响应策略，避免不必要的通信量。当主机或路由器收到查询报文时，它不是立即响应，而是延迟响应</p>
</blockquote>
<p>主机或路由器使用一个随机数产生计时器，它的截止时间是1～10秒。截止时间可以使用1秒或更短的步长。</p>
<p>表中的每一个组都设置计时器。每个主机或路由器在发送成员关系报告报文之前都要等待它的计时器到时。在这段等待时间中，如果在同一组中的其它主机或路由器的计时器先到了截止时间，那么这个主机或路由器就发送成员关系报告报文。因为这个报文是广播发送的，等待的主机或路由器都能收到这个报文，并知道没有必要对这个组发送重复的报文;因此，等待的主机或路由器就取消发送成员关系报告。</p>
<h2 id="传输层协议TCP与UDP"><a href="#传输层协议TCP与UDP" class="headerlink" title="传输层协议TCP与UDP"></a>传输层协议TCP与UDP</h2><h3 id="进程间通信："><a href="#进程间通信：" class="headerlink" title="进程间通信："></a>进程间通信：</h3><blockquote>
<p style="color:orange;">点到点的通信:IP协议负责主机到主机的通信。作为网络层协议，IP协议只能把报文交付给目的主机。</p>
</blockquote>
<blockquote>
<p style="color:orange;">端到端的通信：运输层协议负责进程到进程的通信。TCP和UDP协议负责把报文交付到正确的进程。</p>
</blockquote>
<img src="https://im-so-scared-2.gitee.io/shier_jinghuang/2022/11/12/网际协议IP/进程间通信.png" style="zoom:80%;" />

<h4 id="端口号"><a href="#端口号" class="headerlink" title="端口号:"></a>端口号:</h4><p>主机是用IP地址来标识的，而要标识主机中的进程，就需要使用端口号。TCP/IP协议族中，端口号占16 bit，用0~65535之间的整数标识。TCP和UDP是两个独立的软件模块，因此各自的端口号也相互独立。·端口号只具有本地意义，不同计算机的相同端口号是没有联系的。</p>
<h5 id="三类端口号："><a href="#三类端口号：" class="headerlink" title="三类端口号："></a>三类端口号：</h5><ul>
<li>熟知端口，数值为0~1023，用于标识服务器进程。</li>
<li>登记端口号，数值为1024~49151，为没有熟知端口号的服务器进程使用。使用这个范围的端口号必须在IANA登记，以防止重复。</li>
<li>客户端口号或短暂端口号，数值为49152~65535，留给客户进程选择暂时使用，一般由应用程序开发者指定或由操作系统随机分配一个未使用的端口号。当服务器进程收到客户进程的报文时，就知道了客户进程所使用的动态端口号。通信结束后，这个端口号可供其它客户进程使用。</li>
</ul>
<h5 id="UDP的熟知端口号："><a href="#UDP的熟知端口号：" class="headerlink" title="UDP的熟知端口号："></a>UDP的熟知端口号：</h5><img src="https://im-so-scared-2.gitee.io/shier_jinghuang/2022/11/12/网际协议IP/UDP的熟知端口号.png" style="zoom:80%;" />

<h5 id="套接字："><a href="#套接字：" class="headerlink" title="套接字："></a>套接字：</h5><p>为了使多主机、多进程通信时不发生混乱，必须把主机的IP地址和端口号结合起来使用，称为<strong>套接字(Socket)</strong>.</p>
<blockquote>
<p>客户套接字地址唯一地定义了客户进程;服务器套接字地址唯一地定义了服务器进程;TCP与UDP都使用套接字通信;</p>
</blockquote>
<p>套接字包括**IP地址(32位)<strong>和</strong>端口号(16位)**，共48位.进行通信的一对套接字在整个Internet中是唯一的。</p>
<img src="https://im-so-scared-2.gitee.io/shier_jinghuang/2022/11/12/网际协议IP/套接字.png"  />

<blockquote>
<p style="color:orange;">面向连接的服务：进行数据交换前，先建立连接，传输结柬后释放连接</p>
</blockquote>
<ol>
<li>建立连接阶段:在有关协议数据单元中，须给出源用户与目的用户的完整地址，同时可协商服务质量等选项。</li>
<li>数据交换阶段:这个阶段，每个报文中不必包含用户完整的地址，而是使用一个连接标识符来代替。报文的发送和接收都是按顺序进行的，发送方先发送的报文，在接收方先收到。</li>
<li>释放连接阶段:通过相应的协议数据单元完成释放操作。</li>
</ol>
<blockquote>
<p style="color:orange;">无连接的服务：两个实体通信前不必先建立连接。</p>
</blockquote>
<blockquote>
<p>无连接服务灵活方便，但不能防止报文的丢失、重复和乱序。·每个报文必须包含完整的源地址和目的地址，因此开销较大。</p>
</blockquote>
<h3 id="用户数据报协议UDP"><a href="#用户数据报协议UDP" class="headerlink" title="用户数据报协议UDP"></a>用户数据报协议UDP</h3><pre class="line-numbers language-Python" data-language="Python"><code class="language-Python">#	掌握UDP协议的报文格式
#	掌握UDP协议校验和的计算方法
#	理解UDP协议的优缺点<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span></span></code></pre>

<h4 id="UDP协议简介："><a href="#UDP协议简介：" class="headerlink" title="UDP协议简介："></a>UDP协议简介：</h4><blockquote>
<p style="color:blue;">UDP (User Datagram Protocol，用户数据报协议）提供无连接的传输服务，对等的UDP实体在传输时不建立端到端的连接，只是简单地发送或接收数据报</p>
</blockquote>
<p>UDP协议直接位于IP协议的上层，属于运输层协议。<br>UDP协议不提供端到端的确认和重传功能，它不保证数据包一定能到达目的地，因此是不可靠协议，使用UDP的程序可根据自己的需求设计相应的可靠性机制，如TFTP。</p>
<h5 id="UDP协议的特点"><a href="#UDP协议的特点" class="headerlink" title="UDP协议的特点"></a>UDP协议的特点</h5><p>发送数据之前不需要建立连接，UDP主机不需要维持复杂的连接状态表。</p>
<p>UDP用户数据报只有8个字节的首部开销。<br>网络的拥塞不会使源主机的发送速率降低，这对某些实时应用是很重要的。·当数据包在传送过程中发生错误时UDP不能报告错误。<br>UDP保留应用程序定义的报文边界，当应用程序把一块数据交给UDP发送时，这块数据将作为独立的单元到达对方的应用程序，因此，应用程序必须关心IP数据报的长度。</p>
<h4 id="UDP报文格式："><a href="#UDP报文格式：" class="headerlink" title="UDP报文格式："></a>UDP报文格式：</h4><img src="https://im-so-scared-2.gitee.io/shier_jinghuang/2022/11/12/网际协议IP/UDP报文格式.png" style="zoom: 67%;" />

<p>首部字段和数据字段。首部字段8个字节，由4个字段组成，每个字段2字节</p>
<ol>
<li>源端口:表示发送端的端口号。不同的应用程序使用不同的端口号，实现了同一时间段内多个应用程序可以一起使用网络进行数据的发送和接收。</li>
<li>目的端口:表示数据包被发往的目的端的端口号。</li>
<li>有效负载长度:包括UDP首部和UDP数据在内的整个用户数据报的长度。该字段的最小值是8，一些UDP实现将数据报的大小限制到了8192字节。</li>
<li>校验和:UDP的校验的校验范围包括伪首部（IP首部的部分字段)、UDP首部和UDP数据，该字段是可选的。如果该字段值为零就说明不进行校验。</li>
</ol>
<p>UDP用户数据报封装在IP数据报中，IP数据报的“协议类型”字段的值是17，表示数据部分是从UDP协议来的。</p>
<img src="https://im-so-scared-2.gitee.io/shier_jinghuang/2022/11/12/网际协议IP/UDP封装.png" style="zoom:67%;" />

<h5 id="UDP校验和的计算"><a href="#UDP校验和的计算" class="headerlink" title="UDP校验和的计算"></a>UDP校验和的计算</h5><blockquote>
<p style="color:blue;">UDP校验和的计算与IP和ICMP校验和的计算不同。UDP校拉和T拉H围包括三部分:伪首部、UDP首部以及从应用层来的数据。</p>
</blockquote>
<p>伪首部是IP首部的一部分，其中有些字段要填入0。若校演和不包括伪首部，用户数据报也可能是安全的和正确的。但是，若lP首部受到损伤，则它可能被交付到错误的主机。</p>
<p>伪首部中的高层协议类型是为了确保这个数据报是属于UDP而不是是属丁于TCP。UDP的高层协议类型是17，若这个值在传输过程中出错，接收端就能检出并丢弃这个数据包，从而不会交付给错误的协议。</p>
<h4 id="UDP的应用："><a href="#UDP的应用：" class="headerlink" title="UDP的应用："></a>UDP的应用：</h4><p>UDP适用于这样的进程，它需要简单的请求—响应通信，而较少考虑流量控制和差错控制。对于需要传送成块数据的进程，如FTP，则通常不使用UDP。<br>UDP适用于具有内部流量控制和差错控制机制的进程。对多播和广播来说，UDP是个比较合适的传输层协议。UDP可用于管理进程，如SNMP协议。<br>UDP可用于某些路由选择更新协议，如RIP协议。</p>
<h3 id="传输控制协议TCP"><a href="#传输控制协议TCP" class="headerlink" title="传输控制协议TCP"></a>传输控制协议TCP</h3><pre class="line-numbers language-python" data-language="python"><code class="language-python"><span class="token comment"># 掌握TCP协议的报文格式</span>
<span class="token comment"># 掌握TCP连接的建立和释放过程</span>
<span class="token comment"># 掌握TCP数据传输中编号与确认的过程掌握TCP协议校验和的计算方法</span>
<span class="token comment"># 理解TCP重传机制</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span></span></code></pre>

<h4 id="TCP协议简介："><a href="#TCP协议简介：" class="headerlink" title="TCP协议简介："></a>TCP协议简介：</h4><p>TCP协议是TCP/IP协议族中的面向连接的、可靠的、端到端的运输层协议。</p>
<p>TCP提供全双工服务，全双工连接包括两个独立的、方向相反的数据流。与UDP不同，TCP允许发送和接收字节流形式的数据。为了使服务器和客户端以不同的速度双向发送和接收数据，TCP提供了发送和接收两个缓冲区。TCP在报文中加上一个递增的确认序列号来告诉发送端，接收端期望收到的下一个报文，如果在规定时间内，没有收到关于这个包的确认响应，则重新发送此包，这保证了TCP是一种可靠的传输层协议。</p>
<img src="https://im-so-scared-2.gitee.io/shier_jinghuang/2022/11/12/网际协议IP/TCP的熟知端口号.png" style="zoom:50%;" />

<h4 id="TCP报文格式："><a href="#TCP报文格式：" class="headerlink" title="TCP报文格式："></a>TCP报文格式：</h4><img src="https://im-so-scared-2.gitee.io/shier_jinghuang/2022/11/12/网际协议IP/TCP报文格式.png" style="zoom: 50%;" />

<p>源端口:2字节，主机中发送这个报文的应用程序端口号。</p>
<p>目的端口:2字节，目的主机中接收这个报文的应用程序的端口号。</p>
<p>序列号:4字节，定义了指派给本报文第一个数据字节的一个序号。TCP是流式传输协议，为了保证连通性，要在发送的每一个字节上编号。序号指定了这个序列中的哪一个字节是报文的第一个字节。在连接建立时，双方使用随机数产生器产生初始序号，通常每一方的初始序号都是不同的。</p>
<p>确认号:4字节，接收端期望收到的下一个报文段中数据部分的第一个字节的序号。</p>
<p>首部长度:4位，指定TCP首部的长度，以4字节为单位。首部长度可以在20~60字节之间。因此，这个字段的值可以在5至15之间。<br>保留字段:4位，保留为今后使用，目前应置为0。<br>控制字段:定义了8种不同的标志。用在TCP的流量控制、连接建立和终止以及数据传送的方式等方面。在同一时间可设置一位或多位标志。</p>
<img src="https://im-so-scared-2.gitee.io/shier_jinghuang/2022/11/12/网际协议IP/TCP的控制字段.png" style="zoom:67%;" />

<img src="https://im-so-scared-2.gitee.io/shier_jinghuang/2022/11/12/网际协议IP/\TCP控制字段具体信息.png" style="zoom: 50%;" />

<p>窗口:2字节，窗口字段用来控制对方发送的数据量，单位为字节。TCP连接的一端根据设置的缓存空间大小确定自己的接收窗口大小，然后通知对方以确定对方的发送窗口的上限。这时，发送端必须服从接收端的决定。</p>
<p>检验和:2字节，检验的范围包括首部和数据这两部分。在计算检验和时，要在TCP报文段的前面加上12字节的伪首部。</p>
<p>紧急指针:2字节，只有当URG=1时才有效，指出在本报文段中的紧急数据的最后一个字节的序号，使接收方知道紧急数据共有多少字节(紧急数据结束后是普通数据)。发送方TCP即使发送窗口为0，也要对带有URG标志的数据段实行强制发送。</p>
<p>选项:长度可变，最多40字节。</p>
<p>最大报文段长度MSS (Maximum Segment Size)。</p>
<blockquote>
<ul>
<li> TCP报文段中的数据字段的最大长度。</li>
<li> 与接收窗口值没有关系，不是考虑接收方的缓存是否可以放下TCP报文段中的数据。</li>
<li> 目的是提高网络的利用率，使TCP报文段携带的数据尽可能多，以提高分组中数据部分所占的比例。</li>
<li> MSS应该尽可能大，只要在IP层不需要进行分片即可。但由于传输路径的动态性，很难确定最佳MSS。</li>
<li> 连接建立时，双方把自己能够支持的MSS通知对方，默认值是536 Byte。因此所有主机都能接受的报文段长度是556 Byte。</li>
</ul>
</blockquote>
<p>填充:为了使整个首部长度是4字节的整数倍，全0填充。</p>
<h5 id="TCP的封装："><a href="#TCP的封装：" class="headerlink" title="TCP的封装："></a>TCP的封装：</h5><p>TCP报文封装在lP数据报中，IP数据报的“协议类型”字段的值是6</p>
<img src="https://im-so-scared-2.gitee.io/shier_jinghuang/2022/11/12/网际协议IP/TCP的封装.png" style="zoom:67%;" />

<h4 id="TCP链接的建立与释放："><a href="#TCP链接的建立与释放：" class="headerlink" title="TCP链接的建立与释放："></a>TCP链接的建立与释放：</h4><blockquote>
<p style="color:blue;">连接的三个阶段:连接建立、数据传送和连接释放。连接建立</p>
</blockquote>
<p>服务器首先准备接收TCP连接，这个过程叫做被动打开。这时的服务器的TCP已经准备好接受任何一台主机的TCP连接了。客户程序发出TCP请求的过程叫做主动打开。然后服务器与客户端就开始三次握手过程。</p>
<h5 id="三次握手建立连接："><a href="#三次握手建立连接：" class="headerlink" title="三次握手建立连接："></a>三次握手建立连接：</h5><p>1．客户发送第一个报文，这是一个SYN报文，在这个报文中只有SYN标志置为1，这个报文的作用是使序号同步。</p>
<img src="https://im-so-scared-2.gitee.io/shier_jinghuang/2022/11/12/网际协议IP/第一次握手.png" style="zoom:50%;" />

<p>2．服务器发送第二个报文，即SYN+ACK报文，其中SYN和ACK标志被置为1首先，它是一个用来和对方进行通信的SYN报文。服务器使用这个报文同步初始序号，以便从服务器向客户发送字节。服务器还使用ACK标志确认已从客户端收到了SYN报文，同时给出期望从客户端收到的下一个序号。另外，服务器还定义了客户端要使用的接收窗口的大小。</p>
<img src="https://im-so-scared-2.gitee.io/shier_jinghuang/2022/11/12/网际协议IP/第二次握手.png" style="zoom:50%;" />

<p>3．客户发送第三个报文。这仅仅是一个ACK报文。它使用ACK标志和确认号字段来确认收到了第二个报文。<br>然后客户端就可以通知上层应用进程，连接已经建立。服务器收到客户机的确认后，也通知上层应用进程，连接已经建立。</p>
<img src="https://im-so-scared-2.gitee.io/shier_jinghuang/2022/11/12/网际协议IP/第三次握手.png" style="zoom:50%;" />

<h5 id="半关闭的四次握手方式终止连接："><a href="#半关闭的四次握手方式终止连接：" class="headerlink" title="半关闭的四次握手方式终止连接："></a>半关闭的四次握手方式终止连接：</h5><blockquote>
<p style="color:blue;">半关闭:TCP连接中，一方可以终止发送数据，但仍然保持接收数据，称为半关闭。半关闭通常是由客户端发起的。</p>
</blockquote>
<p><strong>半关闭的过程</strong></p>
<ol>
<li>客户发送FIN报文，半关闭了这个连接</li>
<li>服务器发送ACK报文接受了这个半关闭。但是，现在服务器仍然可以发送数据</li>
<li>当服务器已经把所有处理的数据都发送完毕时，就发送FIN报文</li>
<li>客户端发送ACK报文给予确认。<ul>
<li>在半关闭一条连接后，客户端仍然可以接收服务器发送的数据，而服务器也可以接收客户端发送的确认。但是，客户端不能传送数据给服务器。</li>
</ul>
</li>
</ol>
<img src="https://im-so-scared-2.gitee.io/shier_jinghuang/2022/11/12/网际协议IP/半关闭的四次握手方式终止连接.png" style="zoom:50%;" />

<h4 id="流量控制："><a href="#流量控制：" class="headerlink" title="流量控制："></a>流量控制：</h4><p>发送端收到接收端的确认报文之前，对发送端发送的数据量进行管理</p>
<p>在不考虑流量控制的情况下，传输层协议可以每次只发送一个字节的数据，然后在发送下一个字节数据之前等待接收端的确认报文。这是一个非常缓慢的过程，发送端在等待确认报文时一直处于空闲状态。<br>还有一种情况是传输层协议一次就将全部数据发送出去，而不理会确认报文。这样虽然加速了发送过程，但可能会使接收端来不及接收而瘫痪。此外，若有一部分数据丢失、重复、失序或损坏，发送端就要一直等到接收端将全部数据都检查完毕后才能知道。</p>
<h4 id="滑动窗口"><a href="#滑动窗口" class="headerlink" title="滑动窗口"></a>滑动窗口</h4><p>TCP的流量控制在缓存上定义了一个窗口，称为滑动窗口，窗口大小的单位是字节，TCP发送数据的多少由滑动窗口决定。</p>
<p>TCP报文段首部的窗口字段就是给发送方设置的发送窗口的上限。</p>
<p>发送窗口在连接建立时由双方商定，在通信过程中动态调整。</p>
<p>如果发送方收到接收方的窗口大小U HIr以人tx’P送数据（带URG标志的数据段除外）。</p>
<img src="https://im-so-scared-2.gitee.io/shier_jinghuang/2022/11/12/网际协议IP/滑动窗口.png" style="zoom:67%;" />

<p>发送端只要收到了对方的确认，发送窗口就可前移。<br>发送TCP维护一个指针。每发送一个报文段，指针向前移动一个报文段的距离。</p>
<blockquote>
<p style="color:red;">滑动窗口的右沿可以向左移动吗?</p>
**滑动窗口的右沿向左移动通常发生在对方通知窗口缩小时**。使某些可以发送的数据变成不能发送，如果发送端已经发送了这些数据，就会产生错误。

<p>TCP标准强烈不赞成这样做。</p>
</blockquote>
<blockquote>
<p style="color:red;">滑动窗口的左沿可以向左移动吗?</p>
**窗口的左沿不能向左移动**，因为这表示已经发送出去的并且经过确认的数据现在又要回收了
</blockquote>
<h4 id="拥塞控制："><a href="#拥塞控制：" class="headerlink" title="拥塞控制："></a>拥塞控制：</h4><h5 id="拥塞控制与流量控制的对比"><a href="#拥塞控制与流量控制的对比" class="headerlink" title="拥塞控制与流量控制的对比:"></a>拥塞控制与流量控制的对比:</h5><blockquote>
<p style="color:blue;">出现资源拥塞的条件:    对资源需求的总和>可用资源</p>
</blockquote>
<ul>
<li>防止过多的数据注入到网络中，可以使路由器或者链路不至于过载。</li>
<li>拥塞控制是一个<strong>全局性</strong>的过程，涉及到所有的主机、路由器，以及与降低网络传输性能有关的所有因素。</li>
</ul>
<p><strong>流量控制：</strong>在给定的发送端和接收端之间的<strong>点对点通信量的控制</strong>。</p>
<ul>
<li>流量控制所要做的就是抑制发送端发送数据的速率，以便使接收端来得及接收</li>
</ul>
<h5 id="拥塞控制的作用："><a href="#拥塞控制的作用：" class="headerlink" title="拥塞控制的作用："></a>拥塞控制的作用：</h5><img src="https://im-so-scared-2.gitee.io/shier_jinghuang/2022/11/12/网际协议IP/拥塞控制.png" style="zoom:50%;" />

<h5 id="拥塞控制方法"><a href="#拥塞控制方法" class="headerlink" title="拥塞控制方法"></a>拥塞控制方法</h5><blockquote>
<p style="color:black;">慢开始:        初始设置拥塞窗口cwnd = 1，每收到一个对新的报文段的确认后，将拥塞窗口加1，逐步增大发送端的拥塞窗口cwnd。</p>
</blockquote>
<blockquote>
<p style="color:black;">拥塞避免:    使拥塞窗口cwnd按线性规律缓慢增长，“加法增大”。</p>
</blockquote>
<img src="https://im-so-scared-2.gitee.io/shier_jinghuang/2022/11/12/网际协议IP/慢开始于拥塞避免.png" style="zoom:50%;" />

<blockquote>
<p style="color:black;">快重传:接收方每收到一个失序的报文段后就立即发出重复确认，这样做可以让发送方及早知道有报文段没有到达接收方。发送方只要一连收到三个重复确认就应当立即重传对方尚未收到的报文段。</p>
</blockquote>
<img src="https://im-so-scared-2.gitee.io/shier_jinghuang/2022/11/12/网际协议IP/快重传.png" style="zoom:50%;" />

<blockquote>
<p style="color:black;">快恢复:当发送端收到连续三个重复的确认时，就执行“乘法减小”算法，把慢开始门限ssthresh 减半，但接下去不执行慢开始算法，而是执行拥塞避免算法“加法增大”，使拥塞窗口缓慢地线性增大，实现快恢复。</p>
</blockquote>
<img src="https://im-so-scared-2.gitee.io/shier_jinghuang/2022/11/12/网际协议IP/快恢复.png" style="zoom:50%;" />

<h5 id="发送窗口大小"><a href="#发送窗口大小" class="headerlink" title="发送窗口大小:"></a>发送窗口大小:</h5><p>考虑拥塞控制的情况下，窗口大小由接收窗口和拥塞窗口两者中的较小者决定。接收窗口大小由接收方发送的确认报文中的窗口大小字段值所确定。这是接收端在缓存溢出导致数据被丢弃之前所能接受的最大字节数。拥塞窗口大小是由网络根据拥塞情况而确定的。<br>发送窗口的上限值= Min [rwnd, cwnd]</p>
<blockquote>
<ul>
<li><p>当rwnd &lt; cwnd时，是接收方的接收能力限制发送窗口的最大值</p>
</li>
<li><p>当cwnd &lt; rwnd时，则是网络的拥塞限制发送窗口的最大值。</p>
</li>
</ul>
</blockquote>
<h4 id="差错控制："><a href="#差错控制：" class="headerlink" title="差错控制："></a>差错控制：</h4><h5 id="TCP的差错控制"><a href="#TCP的差错控制" class="headerlink" title="TCP的差错控制"></a>TCP的差错控制</h5><ul>
<li>应用程序把数据流交付给TCP后，就依靠TCP把整个数据流交付给接收端的应用程序，并且保证数据流是按序的、没有差错的、也没有任何一部分是丢失的或重复的。</li>
<li>TCP使用差错控制提供可靠性。差错控制包括以下的一些机制:检测受到损伤的报文、丢失的报文、失序的报文和重复的报文。</li>
</ul>
<blockquote>
<p style="color:blue;">实现方式：通过校验和、确认以及超时重传三种机制实现</p>
</blockquote>
<ul>
<li><p>校验和:用来检验报文是否出错，如果出错，接收端就将报文丢弃</p>
</li>
<li><p>确认</p>
<ul>
<li>累积确认：不必对收到的分组逐个发送确认，而是对按序到达的最后一个分组发送确认</li>
<li>选择确认：首部选项SACK用于报告收到的不连续的字节块的边界</li>
<li>确认报文不携带数据，但消耗一个序号。除了ACK报文之外，确认报文也需要被确认。</li>
</ul>
</li>
<li><p>重传</p>
<ul>
<li>超时计时器到时:发送端为每一个TCP报文段都设置一个超时计时器，若计时器到时仍没收到确认，就重传这个报文。超时计时器的值是动态的，根据报文的往返时间而更新</li>
<li>快重传:发送端只要一连收到三个重复的ACK即可断定有报文段丢失了，就应立即重传而不必等待计时器超时。</li>
</ul>
</li>
</ul>
<h2 id="动态主机配置协议DHCP"><a href="#动态主机配置协议DHCP" class="headerlink" title="动态主机配置协议DHCP"></a>动态主机配置协议DHCP</h2><pre class="line-numbers language-php" data-language="php"><code class="language-php"><span class="token comment">#	掌握DHCP的报文格式</span>
<span class="token comment">#	掌握DHCP的工作原理</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span></span></code></pre>

<h4 id="DHCP简介："><a href="#DHCP简介：" class="headerlink" title="DHCP简介："></a>DHCP简介：</h4><blockquote>
<p style="color:blue;">动态主机配置协议(Dynamic Host Configuration Protocol )是一种动态指定IP地址的机制</p>
</blockquote>
<ul>
<li>DHCP服务器能自动为客户端分配IP地址，减少了客户机IP地址配置的复杂度和管理开销</li>
<li><strong>DHCP服务器</strong>是安装了DHCP服务器软件的计算机，可在网络中设置一台或多台</li>
</ul>
<p>分配给客户的IP是临时的，DHCP客户只能在有限的时间内使用该IP，这段时间称为<strong>租用期</strong><br>租用期的数值应由DHCP服务器决定(默认1小时)，DHCP客户也可在自己发送的报文中提出对租用期的要求。<br>当租期到了的时候，服务器可以把这个IP地址分配给别的主机使用。</p>
<blockquote>
<p style="color:orange;">DHCP使用UDP协议封装，使用UDP的熟知端口67和68，68是DHCP请求报文中的源端口，67是DHCP服务器的目标端口</p>
</blockquote>
<h4 id="DHCP报文格式："><a href="#DHCP报文格式：" class="headerlink" title="DHCP报文格式："></a>DHCP报文格式：</h4><img src="https://im-so-scared-2.gitee.io/shier_jinghuang/2022/11/12/网际协议IP/DHCP报文格式.png" style="zoom:50%;" />

<blockquote>
<ol>
<li>操作码:1字节，表示是请求报文还是应答报文，1代表请求，2代表应答</li>
<li>硬件类型:1字节，表示正在使用的硬件技术的类型，1表示以太网。</li>
<li>硬件地址长度:1字节，如果是以太网，该字段值为6。</li>
<li>跳数:1字节，表示报文经过的DHCP中继的数目，请求报文每经过一个DHCP中继，该字段就加1。</li>
<li>事务ID:4字节，客户端发起一次请求时选择的随机数，服务器应答时返回客户同一个值，用来标识一次地址请求交互过程。</li>
<li>秒数:2字节，表示从客户端发出DHCP请求到现在所经过的秒数。</li>
<li>标志:2字节，第一个比特为广播响应标识位，用来标识dhcp服务器响应报文是采用单播还是广播发送。其余比特保留不用。</li>
<li>客户IP:4字节，如果客户已知道自己的IP，就写入，否则填入0。</li>
<li>你的IP:4字节，服务器分配给客户的IP。</li>
<li>服务器IP:4字节，由服务器填写，DHCP服务器的IP。</li>
<li>DHCP中继IP:4字节，客户发出请求后报文经过的第一个DHCP中继的IP。客户硬件地址:16字节，由客户端设置。</li>
<li>服务器主机名:64字节，由服务器填写。</li>
<li>引导文件名:由服务器为客户指定的配置文件名称。</li>
<li>选项:可选选项字段，包含报文的类型、有效租期、DNS服务器的IP地址、wins服务器的IP地址等配置信息，格式如下:</li>
</ol>
</blockquote>
<img src="https://im-so-scared-2.gitee.io/shier_jinghuang/2022/11/12/网际协议IP/DHCP协议封装.png" style="zoom:67%;" />

<h4 id="静态地址分配与动态地址分配："><a href="#静态地址分配与动态地址分配：" class="headerlink" title="静态地址分配与动态地址分配："></a>静态地址分配与动态地址分配：</h4><h5 id="静态地址分配"><a href="#静态地址分配" class="headerlink" title="静态地址分配"></a>静态地址分配</h5><blockquote>
<p style="color:blue;">将物理地址与IP地址绑定在一起，DHCP服务器将这个绑定文件存放在静态数据库中。</p>
<p style="color:blue;">当有主机请求分配IP时，DHCP服务器首先检查静态数据库，若静态数据库存在所请求的物理地址条目，则将相应的IP地址返回给客户。</p>
</blockquote>
<h5 id="动态地址分配"><a href="#动态地址分配" class="headerlink" title="动态地址分配"></a>动态地址分配</h5><p>DHCP服务器有一个<strong>存放IP地址的数据库</strong>(IP地址池)。当客户请求临时IP地址时，DHCP服务器就查找可用的IP地址分配给客户。</p>
<blockquote>
<p style="color:orange;">从DHCP服务器获得的IP地址是临时的，服务器预设了租用时间，租用时间到期时，客户就更新租用或停止使用这个IP地址。</p>
</blockquote>
<p>服务器对更新租用可选择同意或不同意，如果不同意，客户就停止使用这个地址。</p>
<h4 id="DHCP状态转换"><a href="#DHCP状态转换" class="headerlink" title="DHCP状态转换"></a>DHCP状态转换</h4><img src="https://im-so-scared-2.gitee.io/shier_jinghuang/2022/11/12/网际协议IP/DHCP状态转换.png" style="zoom: 50%;" />

<p><strong>一、初始化状态：</strong></p>
<ul>
<li>当DHCP客户端首次启动时，它处于初始化状态。客户使用向UDP端口67<strong>广播DHCPDISCOVER报文</strong>（带有DHCPDISCOVER选项的请求报文)。</li>
</ul>
<p><strong>二、选择状态：</strong></p>
<ul>
<li>发送DHCPDISCOVER报文后，客户就进入<strong>选择状态</strong>。收到请求报文的服务器用<strong>DHCPOFFER报文</strong>进行响应，提供了IP地址和租用时间，同时，服务器把提供的IP地址锁定，使这个地址不再提供给其它客户。</li>
<li>如果客户没有收到DHCPOFFER报文，它就再尝试4次，每次间隔2s，如果仍然没有应答，客户就睡眠300s后再试 </li>
</ul>
<p><strong>三、 请求状态 ：</strong></p>
<ul>
<li>客户选择多个DHCP服务器所提供的地址中的一个，并广播发送<strong>DHCPREQUEST报文</strong>，然后进入请求状态。</li>
<li>客户在请求状态等待，直到收到服务器的DHCPACK报文，然后客户进入绑定状态。 </li>
</ul>
<p><strong>四、绑定状态：</strong></p>
<ul>
<li>绑定状态下，客户在租用时间到期之前可以使用这个IP地址。当租用时间到达<strong>50%<strong>时，客户发送另一个DHCPREQUEST报文请求更新，进入</strong>更新状态</strong>。</li>
<li>在绑定状态，客户也可以使用<strong>DHCPRELEASE</strong>报文取消租用，进入初始化状态。</li>
</ul>
<p><strong>五、更新状态：</strong></p>
<ul>
<li><p>在更新状态下，如果客户收到更新租用的DHCPACK报文，就把计时器复位，然后回到绑定状态。</p>
</li>
<li><p>如果没有收到DHCPACK报文，且租用时间已到达87.5%，客户将再次向服务器发送DHCPREQUEST报文，进入重新绑定状态。 </p>
</li>
</ul>
<h4 id="DHCP运行过程"><a href="#DHCP运行过程" class="headerlink" title="DHCP运行过程"></a>DHCP运行过程</h4><p><strong>一、发现阶段：</strong></p>
<ul>
<li>DHCP客户寻找DHCP服务器的阶段。DHCP客户以广播方式发送DHCPDISCOVER报文来寻找DHCP服务器。</li>
</ul>
<img src="https://im-so-scared-2.gitee.io/shier_jinghuang/2022/11/12/网际协议IP/DHCP发现阶段.png" style="zoom:67%;" />

<p><strong>二、提供阶段：</strong></p>
<ul>
<li><p>服务器向DHCP客户提供lP地址的阶段。网络中收到<strong>DHCPDISCOVER</strong>的DHCP服务器都会做出响应，从尚未出租的IP中挑选一个分配给客户，向客户发送一个包含出租的IP地址和其它设置的<strong>DHCPOFFER</strong>报文。</p>
<img src="https://im-so-scared-2.gitee.io/shier_jinghuang/2022/11/12/网际协议IP/DHCP提供阶段.png" style="zoom:67%;" /></li>
</ul>
<p><strong>三、选择阶段：</strong></p>
<ul>
<li><p>DHCP客户端选择某台DHCP服务器提供的IP地址的阶段。</p>
</li>
<li><p>如果有多台DHCP服务器向DHCP客户端发来的DHCPOFFER提供报文，则DHCP客户只接受第一个收到的DHCPOFFER提供报文，然后它就以广播方式回答一个DHCPREQUEST请求报文，该报文中包含向它所选定的DHCP服务器请求IP地址的内容。之所以要以广播方式回答，是为了通知所有的DHCP服务器，他将选择某台DHCP服务器所提供的IP地址。</p>
<img src="https://im-so-scared-2.gitee.io/shier_jinghuang/2022/11/12/网际协议IP/DHCP选择阶段.png" style="zoom: 80%;" /></li>
</ul>
<p><strong>四、确认阶段：</strong></p>
<ul>
<li><p>DHCP服务器确认所提供的IP地址的阶段</p>
</li>
<li><p>当DHCP服务器收到DHCP客户回答的DHCPREQUEST请求报文之后，它便向DHCP客户发送一个包含它所提供的IP地址和其它设置的DHCPACK确认报文，告诉DHCP客户可以使用它所提供的IP地址。然后DHCP客户便将其TCP/IP协议与网卡绑定，另外，除DHCP客户选中的服务器外，其它DHCP服务器都收回曾提供的IP地址</p>
<img src="https://im-so-scared-2.gitee.io/shier_jinghuang/2022/11/12/网际协议IP/DHCP确认阶段.png" style="zoom:80%;" /></li>
</ul>
<p><strong>五、重新登录：</strong></p>
<ul>
<li>以后DHCP客户每次重新登录网络时，就不需要再发送DHCPDISCOVER报文了，而是直接发送含有前一次所分配的IP地址的DHCPREQUEST请求报文。当服务器收到这一报文后，它会尝试让客户继续使用原来的IP地址，并回答一个DHCPACK确认报文。</li>
<li>如果此IP地址已无法再分配给原来的客户时，服务器给客户回答一个DHCPNACK否认报文。原来的客户收到否认报文后，必须重新发送DHCPDISCOVER报文来请求新的IP地址。</li>
</ul>
<p><strong>六、更新租约：</strong></p>
<ul>
<li>服务器给客户的IP地址有一个租借期限，期满后服务器会收回IP地址。如果客户要延长其IP租约，则必须更新租约。当时间到了租约期限的50%时，客户会自动向服务器发送更新其IP租约的DHCPREQUEST报文。</li>
</ul>
<h2 id="文件传输协议FTP"><a href="#文件传输协议FTP" class="headerlink" title="文件传输协议FTP"></a>文件传输协议FTP</h2><pre class="line-numbers language-shell" data-language="shell"><code class="language-shell"><span class="token comment">#	掌握FTP的工作原理</span>
<span class="token comment">#	掌握FTP常用命令的使用方法及用途</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span></span></code></pre>

<h3 id="TFP简介："><a href="#TFP简介：" class="headerlink" title="TFP简介："></a>TFP简介：</h3><p><strong>FTP (File Transfer Protocol）服务：</strong></p>
<p>FTP是TCP/IP网络上两台计算机之间传送文件的协议，它是在Internet上最早使用的协议之一。</p>
<blockquote>
<p style="color:blue;">FTP客户机可以给服务器发出命令来下载文件、上传文件、创建或改变服务器上的目录</p>
</blockquote>
<ul>
<li>原来的FTP软件多是命令行操作，有了像Filezilla这样的图形界面软件，使用FTP传输变得方便易学。</li>
<li>大多数FTP服务面向大众，不需要身份认证，即“匿名FTP服务器”。</li>
</ul>
<blockquote>
<p style="color:orange;">FTP协议是应用层的协议，它基于运输层，负责进行文件的传输</p>
</blockquote>
<ul>
<li>FTP是一个8位的客户端-服务器协议，能操作任何类型的文件而不需要进一步处理。</li>
<li>FTP服务<strong>一般运行在TCP的20和21两个端口</strong>。端口20用于在客户端和服务器之间<strong>传输数据流</strong>，而端口21用于<strong>传输控制流</strong>，并且是命令通向ftp服务器的入口</li>
</ul>
<h3 id="两种TCP连接"><a href="#两种TCP连接" class="headerlink" title="两种TCP连接"></a>两种TCP连接</h3><blockquote>
<p>控制连接:建立之后一直持续到客户和服务器间的通信完成为止，用于传送控制命令，服务器使用21号端口</p>
</blockquote>
<blockquote>
<p>数据连接:根据通信的需要随时建立和释放，用于数据传输，服务器通常使用20号端口</p>
</blockquote>
<h5 id="控制连接"><a href="#控制连接" class="headerlink" title="控制连接:"></a>控制连接:</h5><p>创建步骤:服务器在熟知端口21发出被动打开，等待客户，客户使用临时端口发出主动打开。</p>
<img src="https://im-so-scared-2.gitee.io/shier_jinghuang/2022/11/12/网际协议IP/创建TCP连接.png" style="zoom:67%;" />

<h5 id="数据连接："><a href="#数据连接：" class="headerlink" title="数据连接："></a>数据连接：</h5><ul>
<li><strong>主动模式</strong>(PORT)由服务器端向客户端发起数据连接</li>
<li><strong>被动模式</strong>(PASV)由客户端向服务器端发起数据连接</li>
</ul>
<blockquote>
<p style="color:orange;">主动模式是服务器主动连接客户的数据端口，被动模式是服务器被动地等待客户连接自己的数据端口</p>
</blockquote>
<h4 id="主动模式下的FTP服务"><a href="#主动模式下的FTP服务" class="headerlink" title="主动模式下的FTP服务"></a>主动模式下的FTP服务</h4><p><strong>PORT(主动)模式的默认数据端口是20，控制端口是21</strong></p>
<ul>
<li><strong>连接过程</strong><ul>
<li>连接时，客户端使用随机的端口N(N&gt;1024)连接服务器的控制端口21建立控制连接</li>
<li>然后客户端开放N+1号端口进行监听，并通过控制连接向服务器发送命令PORT N+1</li>
<li>服务器用自己的数据端口20连接到客户端的N+1端口，建立数据连接。</li>
</ul>
</li>
</ul>
<h5 id="主动模式存在的问题："><a href="#主动模式存在的问题：" class="headerlink" title="主动模式存在的问题："></a>主动模式存在的问题：</h5><blockquote>
<p style="color:orange;">PORT(主动)模式发送端口给服务器，由服务器连回客户端</p>
</blockquote>
<ol>
<li>如果客户端有防火墙，这样的连接会被认为是外部主机试图连接内部的主机，通常情况下是不允许的</li>
<li>为了解决这个问题，引入了PASV（被动）模式。</li>
</ol>
<h4 id="被动模式下的FTP服务"><a href="#被动模式下的FTP服务" class="headerlink" title="被动模式下的FTP服务"></a>被动模式下的FTP服务</h4><ul>
<li><p>连接过程</p>
<ul>
<li>连接时，客户端使用一个随机的端口N(N&gt;1024)连接服务器的21端口建立控制连接</li>
<li>通过控制连接向服务器发送命令PASV (被动模式)。</li>
<li>服务器使用一个随机的数据端口M(M&gt;1024)并通过控制连接发回客户端</li>
<li>客户端用数据端口N+1连接服务器的端口M。</li>
</ul>
<p>由于是客户端主动发起数据连接，这样就解决了防火墙带来的问题。</p>
</li>
</ul>
<h3 id="FTP通信："><a href="#FTP通信：" class="headerlink" title="FTP通信："></a>FTP通信：</h3><p><strong>控制连接上的通信：</strong>FTP使用NVT ASCII字符集在控制连接上通信。通信过程使用命令和响应来完成，命令和响应都是一个短行，因此不必考虑它的文件结构。每一行以回车换行结束</p>
<img src="https://im-so-scared-2.gitee.io/shier_jinghuang/2022/11/12/网际协议IP/FTP控制链路上的通信.png" style="zoom:50%;" />

<p><strong>数据连接上的通信：</strong>在传送数据之前，客户使用控制连接来做传输准备，定义文件类型、数据结构、传输方式</p>
<img src="https://im-so-scared-2.gitee.io/shier_jinghuang/2022/11/12/网际协议IP/FTP数据连接上的通信.png" style="zoom:50%;" />

<h4 id="文件类型"><a href="#文件类型" class="headerlink" title="文件类型"></a>文件类型</h4><ol>
<li>ASCII文件:传送文本文件的默认格式。每一个字符使用NVT ASCII进行编码。发送端把文件从它自己的表示转换成NVT ASCII字符，而接收端从NVT ASCII字符转换成它自己的字符</li>
<li>EBCDIC文件:若连接的一端或两端使用EBCDIC编码，则可使用EBCDIC编码传送文件</li>
<li>图像文件:传送二进制文件的默认格式。这种文件是作为连续的比特流传送而没有任何解释或编码。在大多数情况下它用来传送二进制文件，如已编译的程序。</li>
</ol>
<h4 id="数据结构"><a href="#数据结构" class="headerlink" title="数据结构"></a>数据结构</h4><ul>
<li>文件结构（默认)︰这种文件没有结构，它是连续的字节流</li>
<li>记录结构:这种文件划分为一些记录，这只能用于文本文件</li>
<li>页面结构:这种文件划分为一些页面，每一个页面有页面号和页面首部。页面可以随机地或顺序地进行存取</li>
</ul>
<h4 id="传输方式"><a href="#传输方式" class="headerlink" title="传输方式"></a>传输方式</h4><blockquote>
<p>流方式:这是默认方式。数据作为连续的字节流从FTP交付给TCP。TCP负责把数据划分为适当大小的报文。若数据是简单的字节流（文件结构），就不需要文件结束符。若数据划分为记录（记录结构)，则每一个记录有1字节的记录结束（EOR）字符，而在文件的结束处有文件结束（EOF）字符。</p>
</blockquote>
<blockquote>
<p>块方式:数据可以按块从FTP交付给TCP。每一个块的前面有3字节首部。第一个字节叫做块描述符，后两个字节定义块的大小，以字节为单位。</p>
</blockquote>
<blockquote>
<p>压缩方式:若文件很大，数据可进行压缩。通常使用的压缩方法是游程长度编码。数据单元的连续出现数可以用一个“出现”和“重复数”来替换。在文本文件中，这通常是空格。在二进制文件中，空字符常常被压缩。</p>
</blockquote>
<h4 id="文件传送"><a href="#文件传送" class="headerlink" title="文件传送"></a>文件传送</h4><blockquote>
<p>从服务器把文件复制到客户端叫做<strong>读取</strong>文件，使用RETR命令完成</p>
</blockquote>
<blockquote>
<p>从客户端把文件复制到服务器叫做<strong>存储</strong>文件，使用STOR命令完成。</p>
</blockquote>
<p>从服务器向客户端发送目录列表或文件名，使用LIST命令完成。FTP把目录或文件名列表当作文件，在数据连接上发送。</p>
<img src="https://im-so-scared-2.gitee.io/shier_jinghuang/2022/11/12/网际协议IP/FTP文件传送.png" style="zoom:67%;" />

<h3 id="FTP响应与命令："><a href="#FTP响应与命令：" class="headerlink" title="FTP响应与命令："></a>FTP响应与命令：</h3><blockquote>
<p style="color:blue;">FTP使用控制连接在客户进程和服务器进程之间完成交互操作，客户端向服务器发送命令，服务器给客户返回响应</p>
</blockquote>
<h5 id="命令"><a href="#命令" class="headerlink" title="命令"></a>命令</h5><ul>
<li>命令形式是ASCII大写字符，后面的变量可以有，也可以没有。</li>
<li>命令可以粗略地划分为6组:接口命令、文件管理命令、数据格式化命端口定义命令、文件传送命令以及杂项命令。</li>
</ul>
<img src="https://im-so-scared-2.gitee.io/shier_jinghuang/2022/11/12/网际协议IP/FTP命令.png" style="zoom: 50%;" />

<h5 id="响应"><a href="#响应" class="headerlink" title="响应"></a>响应</h5><blockquote>
<p style="color:blue;">每一个FTP命令都应该有响应。响应由两个部分组成:3个数字以及跟随在后面的文本。数字部分定义代码，文本部分定义所需的参数或额外的解释</p>
</blockquote>
<img src="https://im-so-scared-2.gitee.io/shier_jinghuang/2022/11/12/网际协议IP/FTP相应.png" style="zoom:67%;" />

<h2 id="超文本传输协议HTTP"><a href="#超文本传输协议HTTP" class="headerlink" title="超文本传输协议HTTP"></a>超文本传输协议HTTP</h2><pre class="line-numbers language-python" data-language="python"><code class="language-python"><span class="token comment">#	掌握HTTP的报文格式</span>
<span class="token comment">#	掌握HTTP的工作原理</span>
<span class="token comment">#	掌握HTTP常用方法</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span></span></code></pre>

<h3 id="万维网体系结构"><a href="#万维网体系结构" class="headerlink" title="万维网体系结构"></a>万维网体系结构</h3><p>万维网，全称为World Wide Web，是一个由许多互相链接的超文本组成的系统，通过互联网访问。</p>
<ul>
<li>在这个系统中，每个有用的事物，称为“资源”，由全局“统一资源标识符(URL)”标识;这些资源通过超文本传输协议传送给用户，用户通过点击超链接来获得资源</li>
<li>每一个网站保存有一个或多个文档，叫做万维网页面。浏览器用来读取万维网上的文档<ul>
<li>客户需要查看网站A的某些信息，它向网站A发送一个请求，请求包含了网站A和其中万维网页面的地址，称为统一资源定位符(URL)</li>
<li>网站A收到请求后，将指定的文档发送给这个客户。</li>
</ul>
</li>
</ul>
<img src="https://im-so-scared-2.gitee.io/shier_jinghuang/2022/11/12/网际协议IP/用户访问万维网示意图.png" style="zoom:67%;" />

<center>用户访问万维网的示意图</center>
> <p style="color:orange;">WWW服务是分布式的客户/服务器模式</p>

<p><strong>浏览器：</strong>客户端程序，可以解释和显示万维网页面。</p>
<p><strong>服务器：</strong></p>
<blockquote>
<ul>
<li>万维网页面存储在服务器上，当客户请求到达时，对应的页面就发送给客户</li>
<li>为了提高效率，服务器通常在其高速缓存中存放被请求过的页面</li>
<li>通过多线程或多进程可使服务器的效率更加提高，服务器在同一时间可回答多个请求</li>
</ul>
</blockquote>
<h4 id="统一资源定位符（URL"><a href="#统一资源定位符（URL" class="headerlink" title="统一资源定位符（URL)"></a>统一资源定位符（URL)</h4><blockquote>
<p style="color:orange;">Uniform Resource Locator，用于表示Internet上资源的位置和访问方法</p>
</blockquote>
<ul>
<li><p>URL由4部分组成:</p>
<ol>
<li><p><strong>协议</strong>:指定了用这个URL的客户/服务器程序。如，HTTP、FTP和TELNET等</p>
</li>
<li><p>主机:指明了信息所存放的地址，可以是逻辑地址也可以是相应的域名</p>
</li>
<li><p>端口:指定了使用主机的某个端口，端口是可选的。</p>
<blockquote>
<p style="color:blue;">如果包含了端口，那么端口就插入在主机和路径之间，和主机用冒号分隔开</p></blockquote>
</li>
<li><p>路径:指定了文件存放的位置。路径本身可以包含斜线，用于将目录与子目录和文件分隔开。</p>
</li>
</ol>
</li>
</ul>
<img src="https://im-so-scared-2.gitee.io/shier_jinghuang/2022/11/12/网际协议IP/统一资源定位符.png" style="zoom:50%;" />

<center>统一资源定位符格式:</center>
##### 静态文档

<p>内容固定的文档，由服务器创建。文档的内容是在创建文档时就确定的，而不是在使用它时。</p>
<h5 id="动态文档"><a href="#动态文档" class="headerlink" title="动态文档"></a>动态文档</h5><p>在浏览器请求该文档时才由万维网服务器创建出来。当请水到丛的，力维网服务器就运行创建动态文档的应用程序。服务器返回这个程序或脚本的输出，把它作为对请求该文档的浏览器的响应。<br>对每个请求都创建出新的文档，所以每个请求得到的动态文档内容可能不同。</p>
<h5 id="活动文档"><a href="#活动文档" class="headerlink" title="活动文档"></a>活动文档</h5><p>有些文档需要程序在客户端运行，称为活动文档。当浏览器请求活动文档时，服务器就发送这个文档的一个副本或脚本，然后这个文档就在客户（浏览器)端运行。</p>
<h3 id="HTTP报文格式："><a href="#HTTP报文格式：" class="headerlink" title="HTTP报文格式："></a>HTTP报文格式：</h3><p>超文本传输协议，Hyperlext Transfer Protocol，用于访问万维网上的数据</p>
<p>它是一种详细规定了浏览器和万维网服务器之间互相通信的规则，通过因特网传送万维网文档的数据传送协议。<br>协议以普通文本、超文本、音频、视频等格式传输数据，它可以快速的在文档之间跳转</p>
<ul>
<li><blockquote>
<p style="color:orange;">HTTP是一个应用层协议，它使用TCP连接进行可靠的传送，在熟知端口80上提供服务。</p></blockquote>
</li>
</ul>
<blockquote>
<p style="color:black;">HTTP报文有两种类型:请求报文和响应报文</p>
- 两种报文格式只有开始行不同。
</blockquote>
<ul>
<li><p>首部行</p>
<ul>
<li>用来说明浏览器、服务器或报文主体的一些信息。</li>
<li>由关键字/值对组成，每行一对，关键字和值用英文冒号“:”分隔，结束的地方都要有回车换行</li>
<li>首部可以有好几行，但也可以不使用。</li>
<li>整个首部行结束时，还要有一个空行将首部行和后面的实体主体分</li>
</ul>
</li>
<li><p>实体主体</p>
<ul>
<li>在请求报文中一般不用，而在响应报文中也可能没有这个字段</li>
</ul>
</li>
</ul>
<h4 id="HTTP请求报文："><a href="#HTTP请求报文：" class="headerlink" title="HTTP请求报文："></a>HTTP请求报文：</h4><img src="https://im-so-scared-2.gitee.io/shier_jinghuang/2022/11/12/网际协议IP/HTTP请求报文.png" style="zoom:67%;" />

<ul>
<li><p>方法:</p>
<ul>
<li><p>常见的有GET和POST方法，在地址栏中输入网址访问网页时，浏览器采用GET方法向服务器获取资源，POST方法要求服务器接受附在请求后面的数据，常用于提交表单。</p>
<img src="https://im-so-scared-2.gitee.io/shier_jinghuang/2022/11/12/网际协议IP/HTTP方法.png" style="zoom:67%;" /></li>
</ul>
</li>
<li><p>URL:向服务器请求的资源</p>
</li>
<li><p>HTTP版本:目前是http/1.1。</p>
</li>
<li><p>首部字段：</p>
<ul>
<li>Accept:指定客户端接受哪些类型的信息，如text/html,image/gif等</li>
<li>Accept-Language:指定一种自然语言。</li>
<li>Accept-Encoding:指定可接受的内容编码，如gzip, deflate。</li>
<li>User-Agent: 允许客户端将它的操作系统、浏览器和其它属性告诉服务器</li>
<li>Host:目标服务器</li>
<li>Connection:连接状态，如Keep-Alive，Close。</li>
</ul>
</li>
</ul>
<h4 id="HTTP回应报文"><a href="#HTTP回应报文" class="headerlink" title="HTTP回应报文"></a>HTTP回应报文</h4><img src="https://im-so-scared-2.gitee.io/shier_jinghuang/2022/11/12/网际协议IP/HTTP回应报文.png" style="zoom:67%;" />

<ul>
<li><p>版本:与请求报文相同</p>
</li>
<li><p>状态码:表示服务器的响应类型，有三位数字组成，其中第一个数字定义了响应的类别，有五种可能取值:</p>
<blockquote>
<ul>
<li>1xx:通知信息—表示请求已接收，继续处理</li>
<li>2xx:成功—表示请求已被成功接收、理解、接受</li>
<li>3xx:重定向一用于已经移动的文件</li>
<li>4xx:客户端错误—请求有语法错误或请求无法实现</li>
<li>5xx:服务器端错误—服务器失效无法完成请求</li>
</ul>
</blockquote>
</li>
</ul>
<img src="https://im-so-scared-2.gitee.io/shier_jinghuang/2022/11/12/网际协议IP/HTTP协议状态码.png" style="zoom: 50%;" />

<center>HTTP协议状态码：</center>
- 短语:解释状态码的简单短语
- 首部字段
  - Date:消息产生时间
  - Server:服务器用来处理请求的软件
  - Set- cookie:设置Cookie及其路径
  - Content-Length:实体正文的长度，十进制
  - Connection:连接状态。
  - Content-Type:发送给接收者的实体正文的媒体类型，如Content-Type:text/html;charset=GB2312。

<h3 id="持久与非持久链接"><a href="#持久与非持久链接" class="headerlink" title="持久与非持久链接"></a>持久与非持久链接</h3><h4 id="非持久连接"><a href="#非持久连接" class="headerlink" title="非持久连接"></a>非持久连接</h4><ul>
<li>对每一个请求/响应都要建立一次TCP连接</li>
<li>非持久连接策略给服务器造成了很大的开销，因为服务器需要N个不同的缓存，而每次打开连接时都要使用慢开始过程</li>
<li>版本1.1以前的HTTP协议默认是非持久连接</li>
</ul>
<h4 id="持久连接"><a href="#持久连接" class="headerlink" title="持久连接"></a>持久连接</h4><ul>
<li><p>在使用持久连接时，服务器在发送响应后，让连接继续为一些请求打开</p>
</li>
<li><p>服务器可以在客户发送关闭请求时等待或关闭这个连接。</p>
</li>
<li><p>服务器可在相同的TCP连接上向客户发送多个对象</p>
<blockquote>
<p>HTTP版本1.1默认使用持久连接策略。</p>
</blockquote>
</li>
</ul>
<h3 id="万维网的工作过程："><a href="#万维网的工作过程：" class="headerlink" title="万维网的工作过程："></a>万维网的工作过程：</h3><p>每个万维网网点都有一个服务器,它不断地监听TCP的端口80，以便发现是否有浏览器（即万维网客户)向它发出连接建立请求。一旦监听到连接请求并建立了TCP连接之后，浏览器就向万维网服务器发出浏览某个页面的请求，服务器接着就返回所请求的页面作为响应。最后释放TCP连接。</p>
<img src="https://im-so-scared-2.gitee.io/shier_jinghuang/2022/11/12/网际协议IP/万维网工作过程.png" style="zoom:67%;" />

<h2 id="路由信息协议RIP"><a href="#路由信息协议RIP" class="headerlink" title="路由信息协议RIP"></a>路由信息协议RIP</h2><pre class="line-numbers language-python" data-language="python"><code class="language-python"><span class="token comment">#	掌握路由协议的分类，理解静态路由和动态路由</span>
<span class="token comment">#	掌握动态路由协议RIP的报文格式、工作原理及工作过程</span>
<span class="token comment">#	掌握RIP计时器的作用</span>
<span class="token comment">#	理解RIP的稳定性</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span></span></code></pre>

<h3 id="一、路由分类："><a href="#一、路由分类：" class="headerlink" title="一、路由分类："></a>一、路由分类：</h3><h4 id="静态路由与动态路由："><a href="#静态路由与动态路由：" class="headerlink" title="静态路由与动态路由："></a>静态路由与动态路由：</h4><h5 id="路由选择"><a href="#路由选择" class="headerlink" title="路由选择:"></a>路由选择:</h5><blockquote>
<p>在从源点到终点的通信过程中，数据包可能经过多个路由器，直到到达连接，目的网络路由器为止。<br>当路由器收到数据包时，它应当将数据包转发到哪一个网络，取决于路由表的信息。</p>
</blockquote>
<h5 id="路由表"><a href="#路由表" class="headerlink" title="路由表:"></a>路由表:</h5><blockquote>
<p>静态路由表:路由信息是管理员设置的，并由管理员手动进行更新。</p>
</blockquote>
<blockquote>
<p>动态路由表:路由信息是随着互联网的变化而自动更新的。</p>
</blockquote>
<p>**路由选择协议:**路由选择协议是一些规则和过程的组合。规则使得路由器之间能够共享他们所知道的互联网情况和邻站信息，而过程用来合并从其它路由器收到的信息。</p>
<h4 id="外部和内部路由选择："><a href="#外部和内部路由选择：" class="headerlink" title="外部和内部路由选择："></a>外部和内部路由选择：</h4><p><strong>自治系统（AS,Autonomous System)</strong><br>由同一个管理机构管理、使用统一路由策略的路由器的集合。<br>最初，自治系统内部只考虑运行单个路由协议;然而，随着网络的发展，一个自治系统内现在也可以支持同时运行多种路由协议</p>
<img src="https://im-so-scared-2.gitee.io/shier_jinghuang/2022/11/12/网际协议IP/自治系统.png" style="zoom:67%;" />

<h5 id="两大类路由选择协议"><a href="#两大类路由选择协议" class="headerlink" title="两大类路由选择协议"></a>两大类路由选择协议</h5><p><strong>内部网关协议IGP(Interior Gateway Protocol)：</strong></p>
<blockquote>
<p style="color:blue;">内部网关协议IGP(Interior Gateway Protocol):在一个自治系统内部使用的路由选择协议</p>
- 目前这类路由选择(域内路由选择)协议使用得最多，如**RIP**和**OSPF协议**。
</blockquote>
<p><strong>外部网关协议EGP(External Gateway Protocol):</strong></p>
<blockquote>
<p style="color:blue;">外部网关协议EGP(External Gateway Protocol):在自治系统之间使用的路由选择协议</p>
- 在外部网关协议中目前使用最多的是**BGP-4**协议
</blockquote>
<h5 id="距离向量路由选择协议"><a href="#距离向量路由选择协议" class="headerlink" title="距离向量路由选择协议:"></a>距离向量路由选择协议:</h5><ol>
<li>从路由器到直接连接的网络的距离定义为1</li>
<li>从路由器到非直接连接的网络的距离定义为所经过的路由器数加1，因此也称为“跳数”</li>
<li>每个节点维护一个到其它节点的最小距离向量表</li>
<li>初始状态下，每个节点只知道到与它直接相连的节点的代价</li>
<li>节点周期性地向其所有相邻节点发送它的路由表信息</li>
<li>当一个节点从邻站收到路由表信息时，使用<strong>Bellman-Ford算法</strong>更新其路由表</li>
</ol>
<h3 id="二、RIP协议："><a href="#二、RIP协议：" class="headerlink" title="二、RIP协议："></a>二、RIP协议：</h3><h4 id="2-1：路由信息协议-Routing-Information-Protocol"><a href="#2-1：路由信息协议-Routing-Information-Protocol" class="headerlink" title="2.1：路由信息协议(Routing Information Protocol)"></a>2.1：路由信息协议(Routing Information Protocol)</h4><p>应用较早、使用较普遍的<strong>内部网关协议</strong>，适用于小型同类网络，是典型的<strong>距离向量路由协议</strong>。</p>
<blockquote>
<ul>
<li><p style="color:orange;">通过广播UDP协议520端口封装成的报文来交换路由信息，默认每30秒发送一次路由信息更新报文</p></li>
<li><p style="color:orange;">RIP使用跳数作为路由距离度量，即数据报到达目标设备所必须经过的路由器数目</p></li>
<li><p style="color:orange;">RIP最多支持的跳数为15，跳数16表示不可达</p></li>
</ul>
</blockquote>
<h5 id="RIP的工作原理"><a href="#RIP的工作原理" class="headerlink" title="RIP的工作原理"></a>RIP的工作原理</h5><ol>
<li>路由器启动时，路由表中只包含直通路由。运行RIP后，路由器会发送Request报文，用来请求邻居路由器的RIP路由</li>
<li>运行RIP的邻居路由器收到该Request报文后，会根据自己的路由表，生成Response报文进行回复</li>
<li>路由器在收到Response报文后，会将相应的路由添加到自己的路由表中</li>
<li>RIP网络稳定以后，每个路由器会<strong>周期性</strong>的向<strong>邻居路由器</strong>通稿自己的<strong>整张路由表</strong>中的路由信息，默认周期为30秒。邻居路由器根据收到的路由信息刷新自己的路由表</li>
<li>路由表中的每一路由项都对应了一个老化定时器，当路由项在180秒内没有任何更新时，定时器超时，该路由项的度量值变为不可达</li>
<li>某路由项的度量值变为不可达后，该路由会在Response报文中发布四次(120秒)，然后从路由表中清除。</li>
</ol>
<h5 id="RIP协议的特点"><a href="#RIP协议的特点" class="headerlink" title="RIP协议的特点"></a>RIP协议的特点</h5><p>仅和相邻路由器交换信息。</p>
<pre class="line-numbers language-none"><code class="language-none">交换的信息是当前本路由器所知道的全部信息，即自己的路由表
按固定的时间间隔交换路由信息<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span></span></code></pre>

<h5 id="RIPv1-vs-RIPv2"><a href="#RIPv1-vs-RIPv2" class="headerlink" title="RIPv1 vs RIPv2"></a>RIPv1 vs RIPv2</h5><p><strong>RIPv1</strong></p>
<blockquote>
<p style="color:orange;">有类别路由协议，不支持VLSM和CIDR且不支持认证。以广播的形式发送报文，目的IP地址为广播地址255.255.255.255</p>
</blockquote>
<p><strong>RIPv2</strong></p>
<blockquote>
<p style="color:orange;">无类别路由协议，支持VLSM、路由聚合与CIDR，支持明文认证和MD5密文认证，以广播或者组播(224.0.0.9)方式发送报文</p>
</blockquote>
<h4 id="2-2：RIP协议报文格式："><a href="#2-2：RIP协议报文格式：" class="headerlink" title="2.2：RIP协议报文格式："></a>2.2：RIP协议报文格式：</h4><h5 id="RIPv1的报文格式："><a href="#RIPv1的报文格式：" class="headerlink" title="RIPv1的报文格式："></a>RIPv1的报文格式：</h5><img src="https://im-so-scared-2.gitee.io/shier_jinghuang/2022/11/12/网际协议IP/RIPv1的报文格式.png" style="zoom:67%;" />

<p> 每个字段的值和作用</p>
<blockquote>
<p>Command:表示该报文是一个请求报文还是响应报文，1表示该报文是请求报文，2表示该报文是响应报文</p>
<p>Version:表示RIP的版本信息。对于RIPv1，该字段的值为1</p>
<p>Address Family ldentifier (AFI):表示地址标识信息，对于IP协议，其值为2</p>
<p>lP address:表示该路由条目的目的IP地址。这一项可以是网络地址、主机地址</p>
<p>Metric:路由条目的度量值，取值范围1-16。</p>
</blockquote>
<blockquote>
<p style="color:blue;">一个RIP路由更新消息中最多可包含25条路由表项，每个路由表项都携带了目的网络的地址和度量值。整个RIP报文大小限制为不超过504字节，如果整个路由表的更新消息超过该大小，需要发送多个RIPv1报文</p>
</blockquote>
<h5 id="RIPv2的报文格式："><a href="#RIPv2的报文格式：" class="headerlink" title="RIPv2的报文格式："></a>RIPv2的报文格式：</h5><img src="https://im-so-scared-2.gitee.io/shier_jinghuang/2022/11/12/网际协议IP/RIPv2的报文格式.png" style="zoom: 50%;" />

<p><strong>RIPv1与RIPv2的不同的字段</strong></p>
<blockquote>
<p>AFI:地址族标识除了表示支持的协议类型外，还可以用来描述认证信息<br>Route tag:用于标记外部路由。<br>Subnet Mask:指定IP地址的子网掩码，定义IP地址的网络或子网部分<br>Next Hop:指定通往目的地址的下—跳IP地址。</p>
</blockquote>
<h3 id="三、RIP环路："><a href="#三、RIP环路：" class="headerlink" title="三、RIP环路："></a>三、RIP环路：</h3><p>RIP网络正常运行时，RTA会通过RTB学习到10.0.0.0/8网络的路由，度量值为1。一旦路由器RTB的直连网络10.0.0.0/8产生故障，RTB会立即检测到该故障，并认为该路由不可达。此时，RTA还没有收到该路由不可达的信息，于是会继续向RTB发送通往10.0.0.0/8的路由信息。RTB会学习此路由信息，认为可以通过RTA到达10.0.0.0/8网络，度量值为2。<br>此后，RTB发送的更新路由表，又会导致RTA路由表的更新，RTA会新增一条度量值为3的10.0.0.0/8网络路由表项，从而形成路由环路。这个过程会持续下去，直到度量值为16。</p>
<h4 id="环路避免-水平分割"><a href="#环路避免-水平分割" class="headerlink" title="环路避免-水平分割"></a>环路避免-水平分割</h4><p>路由器从某个接口学到的路由，不会从该接口再发回给邻居路由器。</p>
<blockquote>
<p>RTA从RTB学习到的10.0.0.0/8网络的路由不会再从RTA的接收接口重新通告给RTB，由此避免了路由环路的产生。</p>
</blockquote>
<img src="https://im-so-scared-2.gitee.io/shier_jinghuang/2022/11/12/网际协议IP/水平分割.png" style="zoom:67%;" />

<h4 id="环路避免-毒性反转"><a href="#环路避免-毒性反转" class="headerlink" title="环路避免-毒性反转"></a>环路避免-毒性反转</h4><p>毒性反转机制的实现可以使错误路由立即超时。<br>毒性反转是指路由器从某个接口学到路由后，将该路由的跳数设置为16，并从原接收接口发回给邻居路由器</p>
<img src="https://im-so-scared-2.gitee.io/shier_jinghuang/2022/11/12/网际协议IP/毒性反转.png" style="zoom:67%;" />

<h4 id="环路避免-触发更新"><a href="#环路避免-触发更新" class="headerlink" title="环路避免-触发更新"></a>环路避免-触发更新</h4><p style="color:skyblue;">触发更新是指当路由信息发生变化时，立即向邻居设备发送触发更新报文，而不需要等待更新定时器超时，从而加速了网络收敛</p>
<img src="https://im-so-scared-2.gitee.io/shier_jinghuang/2022/11/12/网际协议IP/触发更新.png" style="zoom:67%;" />
                
            </div>
            <hr/>

            

    <div class="reprint" id="reprint-statement">
        
            <div class="reprint__author">
                <span class="reprint-meta" style="font-weight: bold;">
                    <i class="fas fa-user">
                        文章作者:
                    </i>
                </span>
                <span class="reprint-info">
                    <a href="/shier_jinghuang/about" rel="external nofollow noreferrer">十二惊惶</a>
                </span>
            </div>
            <div class="reprint__type">
                <span class="reprint-meta" style="font-weight: bold;">
                    <i class="fas fa-link">
                        文章链接:
                    </i>
                </span>
                <span class="reprint-info">
                    <a href="https://im-so-scared-2.gitee.io/shier_jinghuang/shier_jinghuang/2022/12/15/%E7%BD%91%E7%BB%9C%E5%8D%8F%E8%AE%AE%E5%88%86%E6%9E%90%E6%B1%87%E6%80%BB/">https://im-so-scared-2.gitee.io/shier_jinghuang/shier_jinghuang/2022/12/15/%E7%BD%91%E7%BB%9C%E5%8D%8F%E8%AE%AE%E5%88%86%E6%9E%90%E6%B1%87%E6%80%BB/</a>
                </span>
            </div>
            <div class="reprint__notice">
                <span class="reprint-meta" style="font-weight: bold;">
                    <i class="fas fa-copyright">
                        版权声明:
                    </i>
                </span>
                <span class="reprint-info">
                    本博客所有文章除特別声明外，均采用
                    <a href="https://creativecommons.org/licenses/by/4.0/deed.zh" rel="external nofollow noreferrer" target="_blank">CC BY 4.0</a>
                    许可协议。转载请注明来源
                    <a href="/shier_jinghuang/about" target="_blank">十二惊惶</a>
                    !
                </span>
            </div>
        
    </div>

    <script async defer>
      document.addEventListener("copy", function (e) {
        let toastHTML = '<span>复制成功，请遵循本文的转载规则</span><button class="btn-flat toast-action" onclick="navToReprintStatement()" style="font-size: smaller">查看</a>';
        M.toast({html: toastHTML})
      });

      function navToReprintStatement() {
        $("html, body").animate({scrollTop: $("#reprint-statement").offset().top - 80}, 800);
      }
    </script>



            <div class="tag_share" style="display: block;">
                <div class="post-meta__tag-list" style="display: inline-block;">
                    
                        <div class="article-tag">
                            
                                <a href="/shier_jinghuang/tags/%E7%BD%91%E7%BB%9C%E5%8D%8F%E8%AE%AE%E5%88%86%E6%9E%90/">
                                    <span class="chip bg-color">网络协议分析</span>
                                </a>
                            
                        </div>
                    
                </div>
                <div class="post_share" style="zoom: 80%; width: fit-content; display: inline-block; float: right; margin: -0.15rem 0;">
                    <link rel="stylesheet" type="text/css" href="/shier_jinghuang/libs/share/css/share.min.css">
<div id="article-share">

    
    <div class="social-share" data-sites="twitter,facebook,google,qq,qzone,wechat,weibo,douban,linkedin" data-wechat-qrcode-helper="<p>微信扫一扫即可分享！</p>"></div>
    <script src="/shier_jinghuang/libs/share/js/social-share.min.js"></script>
    

    

</div>

                </div>
            </div>
            
        </div>
    </div>

    

    

    

    

    

    

    

    

    

<article id="prenext-posts" class="prev-next articles">
    <div class="row article-row">
        
        <div class="article col s12 m6" data-aos="fade-up">
            <div class="article-badge left-badge text-color">
                <i class="fas fa-chevron-left"></i>&nbsp;上一篇</div>
            <div class="card">
                <a href="/shier_jinghuang/2022/12/16/IPv6%E5%8D%8F%E8%AE%AE%E7%BB%93%E6%9E%84/">
                    <div class="card-image">
                        
                        
                        <img src="/shier_jinghuang/medias/featureimages/23.jpg" class="responsive-img" alt="IPv6协议结构">
                        
                        <span class="card-title">IPv6协议结构</span>
                    </div>
                </a>
                <div class="card-content article-content">
                    <div class="summary block-with-text">
                        
                            
                        
                    </div>
                    <div class="publish-info">
                        <span class="publish-date">
                            <i class="far fa-clock fa-fw icon-date"></i>2022-12-16
                        </span>
                        <span class="publish-author">
                            
                            <i class="fas fa-bookmark fa-fw icon-category"></i>
                            
                            <a href="/shier_jinghuang/categories/%E7%BD%91%E7%BB%9C%E5%B7%A5%E7%A8%8B%E7%9B%B8%E5%85%B3/" class="post-category">
                                    网络工程相关
                                </a>
                            
                            
                        </span>
                    </div>
                </div>
                
                <div class="card-action article-tags">
                    
                    <a href="/shier_jinghuang/tags/%E7%BD%91%E7%BB%9C%E5%8D%8F%E8%AE%AE%E5%88%86%E6%9E%90/">
                        <span class="chip bg-color">网络协议分析</span>
                    </a>
                    
                </div>
                
            </div>
        </div>
        
        
        <div class="article col s12 m6" data-aos="fade-up">
            <div class="article-badge right-badge text-color">
                下一篇&nbsp;<i class="fas fa-chevron-right"></i>
            </div>
            <div class="card">
                <a href="/shier_jinghuang/2022/11/24/%E7%BD%91%E7%BB%9C%E6%94%BB%E5%87%BB%E4%B8%8E%E9%98%B2%E8%8C%83/">
                    <div class="card-image">
                        
                        
                        <img src="/shier_jinghuang/medias/featureimages/20.jpg" class="responsive-img" alt="网络攻击与防范">
                        
                        <span class="card-title">网络攻击与防范</span>
                    </div>
                </a>
                <div class="card-content article-content">
                    <div class="summary block-with-text">
                        
                            
                        
                    </div>
                    <div class="publish-info">
                            <span class="publish-date">
                                <i class="far fa-clock fa-fw icon-date"></i>2022-11-24
                            </span>
                        <span class="publish-author">
                            
                            <i class="fas fa-bookmark fa-fw icon-category"></i>
                            
                            <a href="/shier_jinghuang/categories/%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8/" class="post-category">
                                    网络安全
                                </a>
                            
                            
                        </span>
                    </div>
                </div>
                
                <div class="card-action article-tags">
                    
                    <a href="/shier_jinghuang/tags/%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8/">
                        <span class="chip bg-color">网络安全</span>
                    </a>
                    
                </div>
                
            </div>
        </div>
        
    </div>
</article>

</div>



<!-- 代码块功能依赖 -->
<script type="text/javascript" src="/shier_jinghuang/libs/codeBlock/codeBlockFuction.js"></script>


  <!-- 是否加载使用自带的 prismjs. -->
  <script type="text/javascript" src="/shier_jinghuang/libs/prism/prism.min.js"></script>


<!-- 代码语言 -->

<script type="text/javascript" src="/shier_jinghuang/libs/codeBlock/codeLang.js"></script>


<!-- 代码块复制 -->

<script type="text/javascript" src="/shier_jinghuang/libs/codeBlock/codeCopy.js"></script>


<!-- 代码块收缩 -->

<script type="text/javascript" src="/shier_jinghuang/libs/codeBlock/codeShrink.js"></script>



    </div>
    <div id="toc-aside" class="expanded col l3 hide-on-med-and-down">
        <div class="toc-widget card" style="background-color: white;">
            <div class="toc-title"><i class="far fa-list-alt"></i>&nbsp;&nbsp;目录</div>
            <div id="toc-content"></div>
        </div>
    </div>
</div>

<!-- TOC 悬浮按钮. -->

<div id="floating-toc-btn" class="hide-on-med-and-down">
    <a class="btn-floating btn-large bg-color">
        <i class="fas fa-list-ul"></i>
    </a>
</div>


<script src="/shier_jinghuang/libs/tocbot/tocbot.min.js"></script>
<script>
    $(function () {
        tocbot.init({
            tocSelector: '#toc-content',
            contentSelector: '#articleContent',
            headingsOffset: -($(window).height() * 0.4 - 45),
            collapseDepth: Number('0'),
            headingSelector: 'h2, h3, h4'
        });

        // Set scroll toc fixed.
        let tocHeight = parseInt($(window).height() * 0.4 - 64);
        let $tocWidget = $('.toc-widget');
        $(window).scroll(function () {
            let scroll = $(window).scrollTop();
            /* add post toc fixed. */
            if (scroll > tocHeight) {
                $tocWidget.addClass('toc-fixed');
            } else {
                $tocWidget.removeClass('toc-fixed');
            }
        });

        
        /* 修复文章卡片 div 的宽度. */
        let fixPostCardWidth = function (srcId, targetId) {
            let srcDiv = $('#' + srcId);
            if (srcDiv.length === 0) {
                return;
            }

            let w = srcDiv.width();
            if (w >= 450) {
                w = w + 21;
            } else if (w >= 350 && w < 450) {
                w = w + 18;
            } else if (w >= 300 && w < 350) {
                w = w + 16;
            } else {
                w = w + 14;
            }
            $('#' + targetId).width(w);
        };

        // 切换TOC目录展开收缩的相关操作.
        const expandedClass = 'expanded';
        let $tocAside = $('#toc-aside');
        let $mainContent = $('#main-content');
        $('#floating-toc-btn .btn-floating').click(function () {
            if ($tocAside.hasClass(expandedClass)) {
                $tocAside.removeClass(expandedClass).hide();
                $mainContent.removeClass('l9');
            } else {
                $tocAside.addClass(expandedClass).show();
                $mainContent.addClass('l9');
            }
            fixPostCardWidth('artDetail', 'prenext-posts');
        });
        
    });
</script>

    

</main>




    <footer class="page-footer bg-color">
    
        <link rel="stylesheet" href="/shier_jinghuang/libs/aplayer/APlayer.min.css">
<style>
    .aplayer .aplayer-lrc p {
        
        display: none;
        
        font-size: 12px;
        font-weight: 700;
        line-height: 16px !important;
    }

    .aplayer .aplayer-lrc p.aplayer-lrc-current {
        
        display: none;
        
        font-size: 15px;
        color: #42b983;
    }

    
    .aplayer.aplayer-fixed.aplayer-narrow .aplayer-body {
        left: -66px !important;
    }

    .aplayer.aplayer-fixed.aplayer-narrow .aplayer-body:hover {
        left: 0px !important;
    }

    
</style>
<div class="">
    
    <div class="row">
        <meting-js class="col l8 offset-l2 m10 offset-m1 s12"
                   server="netease"
                   type="playlist"
                   id="503838841"
                   fixed='true'
                   autoplay='false'
                   theme='#42b983'
                   loop='all'
                   order='random'
                   preload='auto'
                   volume='0.7'
                   list-folded='true'
        >
        </meting-js>
    </div>
</div>

<script src="/shier_jinghuang/libs/aplayer/APlayer.min.js"></script>
<script src="/shier_jinghuang/libs/aplayer/Meting.min.js"></script>

    

    <div class="container row center-align"
         style="margin-bottom: 0px !important;">
        <div class="col s12 m8 l8 copy-right">
            Copyright&nbsp;&copy;
            
                <span id="year">2019-2023</span>
            
            <a href="/shier_jinghuang/about" target="_blank">十二惊惶</a>
            |&nbsp;Powered by&nbsp;<a href="https://hexo.io/" target="_blank">Hexo</a>
            |&nbsp;Theme&nbsp;<a href="https://github.com/blinkfox/hexo-theme-matery" target="_blank">Matery</a>
            <br>
            
                &nbsp;<i class="fas fa-chart-area"></i>&nbsp;站点总字数:&nbsp;<span
                        class="white-color">289.6k</span>
            
            
            
                
            
            
                <span id="busuanzi_container_site_pv">
                &nbsp;|&nbsp;<i class="far fa-eye"></i>&nbsp;总访问量:&nbsp;
                    <span id="busuanzi_value_site_pv" class="white-color"></span>
            </span>
            
            
                <span id="busuanzi_container_site_uv">
                &nbsp;|&nbsp;<i class="fas fa-users"></i>&nbsp;总访问人数:&nbsp;
                    <span id="busuanzi_value_site_uv" class="white-color"></span>
            </span>
            
            <br>

            <!-- 运行天数提醒. -->
            
            <br>
            
        </div>
        <div class="col s12 m4 l4 social-link social-statis">
    <a href="https://github.com/blinkfox" class="tooltipped" target="_blank" data-tooltip="访问我的GitHub" data-position="top" data-delay="50">
        <i class="fab fa-github"></i>
    </a>



    <a href="mailto:1181062873@qq.com" class="tooltipped" target="_blank" data-tooltip="邮件联系我" data-position="top" data-delay="50">
        <i class="fas fa-envelope-open"></i>
    </a>







    <a href="tencent://AddContact/?fromId=50&fromSubId=1&subcmd=all&uin=1181062873" class="tooltipped" target="_blank" data-tooltip="QQ联系我: 1181062873" data-position="top" data-delay="50">
        <i class="fab fa-qq"></i>
    </a>







    <a href="/shier_jinghuang/atom.xml" class="tooltipped" target="_blank" data-tooltip="RSS 订阅" data-position="top" data-delay="50">
        <i class="fas fa-rss"></i>
    </a>

</div>
    </div>
</footer>

<div class="progress-bar"></div>


    <!-- 搜索遮罩框 -->
<div id="searchModal" class="modal">
    <div class="modal-content">
        <div class="search-header">
            <span class="title"><i class="fas fa-search"></i>&nbsp;&nbsp;搜索</span>
            <input type="search" id="searchInput" name="s" placeholder="请输入搜索的关键字"
                   class="search-input">
        </div>
        <div id="searchResult"></div>
    </div>
</div>

<script type="text/javascript">
$(function () {
    var searchFunc = function (path, search_id, content_id) {
        'use strict';
        $.ajax({
            url: path,
            dataType: "xml",
            success: function (xmlResponse) {
                // get the contents from search data
                var datas = $("entry", xmlResponse).map(function () {
                    return {
                        title: $("title", this).text(),
                        content: $("content", this).text(),
                        url: $("url", this).text()
                    };
                }).get();
                var $input = document.getElementById(search_id);
                var $resultContent = document.getElementById(content_id);
                $input.addEventListener('input', function () {
                    var str = '<ul class=\"search-result-list\">';
                    var keywords = this.value.trim().toLowerCase().split(/[\s\-]+/);
                    $resultContent.innerHTML = "";
                    if (this.value.trim().length <= 0) {
                        return;
                    }
                    // perform local searching
                    datas.forEach(function (data) {
                        var isMatch = true;
                        var data_title = data.title.trim().toLowerCase();
                        var data_content = data.content.trim().replace(/<[^>]+>/g, "").toLowerCase();
                        var data_url = data.url;
                        data_url = data_url.indexOf('/') === 0 ? data.url : '/' + data_url;
                        var index_title = -1;
                        var index_content = -1;
                        var first_occur = -1;
                        // only match artiles with not empty titles and contents
                        if (data_title !== '' && data_content !== '') {
                            keywords.forEach(function (keyword, i) {
                                index_title = data_title.indexOf(keyword);
                                index_content = data_content.indexOf(keyword);
                                if (index_title < 0 && index_content < 0) {
                                    isMatch = false;
                                } else {
                                    if (index_content < 0) {
                                        index_content = 0;
                                    }
                                    if (i === 0) {
                                        first_occur = index_content;
                                    }
                                }
                            });
                        }
                        // show search results
                        if (isMatch) {
                            str += "<li><a href='" + data_url + "' class='search-result-title'>" + data_title + "</a>";
                            var content = data.content.trim().replace(/<[^>]+>/g, "");
                            if (first_occur >= 0) {
                                // cut out 100 characters
                                var start = first_occur - 20;
                                var end = first_occur + 80;
                                if (start < 0) {
                                    start = 0;
                                }
                                if (start === 0) {
                                    end = 100;
                                }
                                if (end > content.length) {
                                    end = content.length;
                                }
                                var match_content = content.substr(start, end);
                                // highlight all keywords
                                keywords.forEach(function (keyword) {
                                    var regS = new RegExp(keyword, "gi");
                                    match_content = match_content.replace(regS, "<em class=\"search-keyword\">" + keyword + "</em>");
                                });

                                str += "<p class=\"search-result\">" + match_content + "...</p>"
                            }
                            str += "</li>";
                        }
                    });
                    str += "</ul>";
                    $resultContent.innerHTML = str;
                });
            }
        });
    };

    searchFunc('/shier_jinghuang/search.xml', 'searchInput', 'searchResult');
});
</script>

    <!-- 白天和黑夜主题 -->
<div class="stars-con">
    <div id="stars"></div>
    <div id="stars2"></div>
    <div id="stars3"></div>  
</div>

<script>
    function switchNightMode() {
        $('<div class="Cuteen_DarkSky"><div class="Cuteen_DarkPlanet"></div></div>').appendTo($('body')),
        setTimeout(function () {
            $('body').hasClass('DarkMode') 
            ? ($('body').removeClass('DarkMode'), localStorage.setItem('isDark', '0'), $('#sum-moon-icon').removeClass("fa-sun").addClass('fa-moon')) 
            : ($('body').addClass('DarkMode'), localStorage.setItem('isDark', '1'), $('#sum-moon-icon').addClass("fa-sun").removeClass('fa-moon')),
            
            setTimeout(function () {
            $('.Cuteen_DarkSky').fadeOut(1e3, function () {
                $(this).remove()
            })
            }, 2e3)
        })
    }
</script>

    <!-- 回到顶部按钮 -->
<div id="backTop" class="top-scroll">
    <a class="btn-floating btn-large waves-effect waves-light" href="#!">
        <i class="fas fa-arrow-up"></i>
    </a>
</div>


    <script src="/shier_jinghuang/libs/materialize/materialize.min.js"></script>
    <script src="/shier_jinghuang/libs/masonry/masonry.pkgd.min.js"></script>
    <script src="/shier_jinghuang/libs/aos/aos.js"></script>
    <script src="/shier_jinghuang/libs/scrollprogress/scrollProgress.min.js"></script>
    <script src="/shier_jinghuang/libs/lightGallery/js/lightgallery-all.min.js"></script>
    <script src="/shier_jinghuang/js/matery.js"></script>

    

    

    <!-- 雪花特效 -->
    

    <!-- 鼠标星星特效 -->
    

     
        <script src="https://ssl.captcha.qq.com/TCaptcha.js"></script>
        <script src="/shier_jinghuang/libs/others/TencentCaptcha.js"></script>
        <button id="TencentCaptcha" data-appid="xxxxxxxxxx" data-cbfn="callback" type="button" hidden></button>
    

    <!-- Baidu Analytics -->

    <!-- Baidu Push -->

<script>
    (function () {
        var bp = document.createElement('script');
        var curProtocol = window.location.protocol.split(':')[0];
        if (curProtocol === 'https') {
            bp.src = 'https://zz.bdstatic.com/linksubmit/push.js';
        } else {
            bp.src = 'http://push.zhanzhang.baidu.com/push.js';
        }
        var s = document.getElementsByTagName("script")[0];
        s.parentNode.insertBefore(bp, s);
    })();
</script>

    
    <script src="/shier_jinghuang/libs/others/clicklove.js" async="async"></script>
    
    
    <script async src="/shier_jinghuang/libs/others/busuanzi.pure.mini.js"></script>
    

    

    

    <!--腾讯兔小巢-->
    
    

    

    

    
    <script src="/shier_jinghuang/libs/instantpage/instantpage.js" type="module"></script>
    

</body>

</html>
